Alignement सभी प्रकार के लिए प्रभावी नहीं है। तुम एक संरचना का उपयोग कार्रवाई में विशेषताओं को देखने के लिए विचार करना चाहिए:
#include <stdio.h>
struct my_float {
float number;
} __attribute__((aligned(0x1000)));
struct my_float a[4] = { {1.0}, {2.0}, {3.0}, {4.0} };
int
main(void)
{
printf("%p %p %p %p\n", &a[0], &a[1], &a[2], &a[3]);
}
और फिर, आप पढ़ेंगे:
0x603000 0x604000 0x605000 0x606000
कौन सा है कि तुम क्या उम्मीद कर रहे थे।
संपादित करें: @yzap और निम्नलिखित @Caleb प्रकरण टिप्पणी से पुश किया, प्रारंभिक समस्या जीसीसी संस्करण केवल के कारण है। मैं निवेदक के स्रोत कोड के साथ जीसीसी 3.4.6 पर देख लिया है जीसीसी 4.4.1 बनाम:
$ ./test_orig-3.4.6
0x7fffe217d200 0x7fffe217d204 0x7fffe217d208 0x7fffe217d20c
$ ./test_orig-4.4.1
0x7fff81db9000 0x7fff81db9004 0x7fff81db9008 0x7fff81db900c
यह है कि पुराने जीसीसी संस्करणों (कहीं 4.4.1 से पहले) संरेखण विकृतियों से पता चलता अब स्पष्ट है।
नोट 1: मेरा प्रस्तावित कोड सवाल जो मैं "सरणी के प्रत्येक क्षेत्र संरेखित" के रूप में समझा उत्तर नहीं देता।
नोट 2: गैर-स्थैतिक [] के अंदर मुख्य() और जीसीसी 3.4.6 के साथ संकलन करना स्ट्रक्चर की सरणी के संरेखण निर्देश को तोड़ता है लेकिन structs के बीच 0x1000 दूरी रखता है ... अभी भी बुरा! (समाधान के लिए @zifre उत्तर देखें)
+1 सही उत्तर। स्थानीय सरणी स्थिर बनाने के लिए एक वैकल्पिक समाधान है। ढेर पर संरेखण हमेशा एक समस्या है और इसे टालने की आदत में जाना सर्वोत्तम है। –
ओह हाँ, मैंने इसे स्थिर बनाने के बारे में नहीं सोचा था। यह एक अच्छा विचार है क्योंकि यह नाम टकराव को रोकता है। मैं अपना जवाब संपादित करूंगा। – Zifre
ध्यान दें कि इसे स्थैतिक बनाना भी इसे गैर-पुनर्वित्तक और गैर-थ्रेड-सुरक्षित बनाता है। – ArchaeaSoftware