this question से कोई यह मानना शुरू कर सकता है कि संघ का संरेखण इसके व्यक्तिगत सदस्यों के सबसे बड़े संरेखण से कम नहीं है। लेकिन मुझे long long
प्रकार जीसीसी/जी ++ में टाइप करने में समस्या है। पूर्ण उदाहरण here पाया जा सकता है, लेकिन यहाँ मेरे सवाल के लिए प्रासंगिक भागों हैं:लंबे समय तक संघ के सदस्य का संरेखण क्यों संघ/संरचना से बड़ा है? क्या ये सही है?
union ull {
long long m;
};
struct sll {
long long m;
};
int main() {
#define pr(v) cout << #v ": " << (v) << endl
pr(sizeof(long long));
pr(__alignof__(long long));
pr(sizeof(ull));
pr(__alignof__(ull));
pr(sizeof(sll));
pr(__alignof__(sll));
};
यह निम्न उत्पादन में परिणाम है:
sizeof(long long): 8
__alignof__(long long): 8
sizeof(ull): 8
__alignof__(ull): 4
sizeof(sll): 8
__alignof__(sll): 4
एक संघ सदस्य है कि से भी बड़ा के संरेखण क्यों है युक्त संघ का?
[अद्यतन]
कीथ के जवाब alignof के अनुसार यहाँ गलत है। लेकिन मैं निम्नलिखित का परीक्षण करता हूं और ऐसा लगता है कि alignof हमें सच बताता है। देखें:
union ull {
long long m;
};
long long a;
char b;
long long c;
char d;
ull e;
int main() {
#define pr(v) cout << #v ": " << (v) << endl
pr(size_t((void*)&b));
pr(size_t((void*)&c));
pr(size_t((void*)&d));
pr(size_t((void*)&e));
pr(size_t((void*)&c) - size_t((void*)&b));
pr(size_t((void*)&e) - size_t((void*)&d));
};
उत्पादन:
size_t((void*)&b): 134523840
size_t((void*)&c): 134523848
size_t((void*)&d): 134523856
size_t((void*)&e): 134523860
size_t((void*)&c) - size_t((void*)&b): 8
size_t((void*)&e) - size_t((void*)&d): 4
तो, long long
के संरेखण 8 और long long
युक्त संघ के संरेखण वैश्विक डेटा में 4 है। स्थानीय दायरे के लिए मैं इसका परीक्षण नहीं कर सकता क्योंकि ऐसा लगता है कि संकलक स्थानीय डेटा को पुनर्व्यवस्थित करने के लिए स्वतंत्र है - इसलिए यह चाल काम नहीं करती है। क्या आप इस पर टिप्पणी कर सकते हैं?
[/ अद्यतन]
मुझे रेड हैट पर एक ही चीज़ दिखाई देती है, जीसी 4.7.0 '-एम 32' के साथ, लेकिन * नहीं * '-m64' (सभी' 8') के साथ। – BoBTFish
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=52023 _Alignof (C11) के लिए संबंधित gcc बग का एक लिंक। –