सी ++ मानक यह बताता है कि:
- वस्तुओं एक संरेखण आवश्यकता उनके आकार एक से अधिक है, जिनमें से है (इसलिए यदि
int
4 बाइट व्यापक है, तो यह 1, 2 या 4 बाइट्स की एक संरेखण की आवश्यकता है, कार्यान्वयन के आधार पर)।
- सदस्य ऑब्जेक्ट्स (यदि वे
public
जैसे एक्सेस विनिर्देशकों द्वारा अलग नहीं हैं) वे सभी को
- घोषित किए गए क्रम में आवंटित किए गए हैं और उन्हें उनके संरेखण आवश्यकताओं का सम्मान करने के लिए आवंटित किया गया है।
तो नहीं, मानक यह नहीं कहता कि कक्षा में 12 बाइट्स का आकार होना चाहिए।
लेकिन यह का कहना है कि b
a
के बाद आवंटित किया जाना चाहिए, और कहा कि c
b
के बाद आवंटित किया जाना चाहिए है।
तो वर्ग का कुल आकार, सदस्य (4 + 1 + 4 = 9) के अलावा तीन गद्दी के बाइट्स के आकार जा रहा है 12.
के लिए कुल एक और नियम है समाप्त होता है जिसका यहां कोई प्रभाव नहीं पड़ता है, लेकिन इससे कोई फर्क नहीं पड़ता कि आपने सदस्यों को a, c, b
क्रम में परिभाषित किया था।
युक्त वर्ग (A
) कठोरतम गठबंधन सदस्य वस्तु से संरेखण आवश्यकता इनहेरिट करती है। यही है, क्योंकि यह एक int
होता है, यह एक ही संरेखण आवश्यकता एक int
करता है के रूप में है। और क्योंकि वस्तु के कुल आकार अपने संरेखण आवश्यकता का गुणांक होना चाहिए, एक वर्ग के क्रम में सदस्यों युक्त a, b, c
होगा अभी भी भंडारण के 12 बाइट्स की आवश्यकता है। यह केवल b
और c
के बीच कक्षा के अंत तक पैडिंग के 3 बाइट्स को स्थानांतरित करेगा।
हालांकि, कुछ अन्य मामलों में, आकार के अवरोही क्रम में सदस्यों को पुन: व्यवस्थित करने से कभी-कभी कक्षा के आकार को कम कर सकता है।
मान लीजिए हम बजाय इस तरह एक वर्ग था था:
class B {
char a;
double b;
int c;
};
यह भंडारण के 24 बाइट्स (1 a
के लिए बाइट्स, b
के लिए 8 बाइट, और c
के लिए 4 बाइट की आवश्यकता रही होगी, लेकिन तब के लिए सुनिश्चित करें कि b
8-बाइट सीमा पर समाप्त होता है, हमें a
और b
के बीच पैडिंग के बाइट्स की आवश्यकता होगी, और यह सुनिश्चित करने के लिए कि पूरी कक्षा 8 के एक से अधिक आकार के साथ समाप्त हो, हमें एक और 4 बाइट की आवश्यकता है c
के बाद
लेकिन आकार के अनुसार सदस्यों को पुन: क्रम, इस तरह: एक कक्षा में
class B {
double b;
int c;
char a;
};
परिणाम केवल 16 बाइट्स की आवश्यकता होती है:
ही 1 + 4 + 8 बाइट्स सदस्य खुद को वस्तुओं के लिए, लेकिन अब c
पहले से ही एक 4-बाइट सीमा पर गठबंधन है, और a
किसी भी संरेखण कभी नहीं की जरूरत है, इसलिए केवल संरेखण हम की जरूरत है सुनिश्चित करने के लिए B
एक आकार है कि एक से अधिक है कि है (क्योंकि यह b
जो एक 8 बाइट सीमा को समाप्त होता है के बाद है) 8 में से सदस्य 13 बाइट लेते हैं, इसलिए हम पैडिंग के 3 बाइट जोड़ सकते हैं, और कक्षा 16 बाइट्स पर समाप्त होती है, 33% छोटी थी एन पहला संस्करण।
आप यह भी बता सकते हैं कि अधिकांश आर्किटेक्चर पर, गलत गठबंधन ऑब्जेक्ट तक पहुंचने से कुछ प्रकार की बस त्रुटि हो जाएगी, जिससे प्रोग्राम क्रैश हो जाएगा। इंटेल पर, प्रोग्राम क्रैश नहीं होगा, लेकिन डेटा गलत तरीके से होने पर यह अभी भी धीमा हो जाएगा। –