यह एक गुणात्मक उपाय है कि बाहर मंत्र कितना बड़ा एक उदाहरण सदस्यों संरचना/वर्ग प्रकार के भीतर की एक विशिष्ट आदेश देने के लिए बाइट की संख्या में है। आम तौर पर, कंपाइलर्स संरचना/कक्षा के उदाहरणों को कॉम्पैक्ट कर सकते हैं यदि सदस्यों को उनके बाइट-साइज द्वारा अवरोही क्रम में क्रमबद्ध किया जाता है (यानी सबसे बड़ा सबसे छोटा, आखिरी सदस्य अंतिम) संरचना के भीतर। विचार करें:
struct A
{
char c; float f; short s;
};
struct B
{
float f; short s; char c;
};
दोनों संरचनाओं में बिल्कुल वही जानकारी होती है। इस उदाहरण के लिए; फ्लोट प्रकार 4 बाइट लेता है, लघु प्रकार 2 लेता है और चरित्र 1 बाइट लेता है। हालांकि, पहली संरचना ए में यादृच्छिक क्रम में सदस्य हैं, जबकि दूसरी संरचना बी अपने बाइट आकार के अनुसार सदस्यों को आदेश देती है (यह कुछ आर्किटेक्चर पर अलग हो सकती है, मैं इस उदाहरण में 4-बाइट संरेखण के साथ x86 इंटेल CPU आर्किटेक्चर मान रहा हूं)।
printf("size of A: %d", sizeof (A)); // size of A: 12;
printf("size of B: %d", sizeof (B)); // size of B: 8;
आप आकार 7 बाइट्स होने की अपेक्षा करेंगे, तो आप यह सोचते हैं की जाएगी कि सदस्यों एक 1-बाइट संरेखण का उपयोग कर संरचना में पैक कर रहे हैं: अब संरचना का आकार पर विचार करें। हालांकि कुछ कंपाइलर्स इसे अनुमति देते हैं, आम तौर पर अधिकांश कंप्यूटर्स ऐतिहासिक कारणों से डी-वर्ड (डबल-वर्ड) या क्यूडब्ल्यूओआर (क्वाड-वर्ड) सामान्य प्रयोजन रजिस्ट्रार के साथ अधिकांश सीपीयू का काम 4-बाइट या 8-बाइट संरेखण का उपयोग करते हैं)।
पैकिंग प्राप्त करने के लिए काम पर 2 पैडिंग तंत्र हैं।
सबसे पहले, प्रत्येक सदस्य है कि एक बाइट आकार बाइट-संरेखण अगले सदस्य (सदस्यों) यदि जिसके परिणामस्वरूप बाइट आकार छोटा या बाइट-संरेखण के बराबर है 'के साथ विलय कर दिया' है की तुलना में छोटे है। संरचना बी में, सदस्यों और सी को इस तरह से विलय किया जा सकता है; सी = 1 3 बाइट < = 4-बाइट संरेखण के लिए उनके संयुक्त आकार एस + 1 बाइट के लिए 2 बाइट्स हैं। संरचना ए के लिए, ऐसा कोई विलय नहीं हो सकता है, और प्रत्येक सदस्य प्रभावी रूप से संरचना के पैकिंग में 4 बाइट्स का उपभोग करता है।
संरचना का कुल आकार फिर से गद्देदार है ताकि अगली संरचना संरेखण सीमा पर शुरू हो सके। उदाहरण में बी बाइट्स की कुल संख्या 7 होगी। अगली 4-बाइट सीमा बाइट 8 पर निहित है, इसलिए सरणी आवंटन को उदाहरणों के तंग अनुक्रम के रूप में अनुमति देने के लिए संरचना को 1 बाइट से जोड़ा जाता है।
ध्यान दें कि विजुअल C++/जीसीसी 1 बाइट, 2 बाइट्स के 2 और उच्च गुणकों के विभिन्न संरेखण अनुमति देते हैं।समझें कि यह आपके कंपाइलर के लिए इष्टतम कोड बनाने के लिए आपके कंपाइलर की क्षमता के विरुद्ध काम करता है। दरअसल, निम्नलिखित उदाहरण में, प्रत्येक बाइट को प्रत्येक पठन ऑपरेशन के लिए एकल-बाइट निर्देश का उपयोग करके एकल बाइट के रूप में पढ़ा जाएगा। प्रैक्टिस में, हार्डवेयर अभी भी पूरी मेमोरी लाइन लाएगा जिसमें प्रत्येक बाइट कैश में पढ़ा जाएगा, और निर्देश 4 बार निष्पादित करेगा, भले ही 4 बाइट एक ही डीडब्ल्यूओआर में बैठे हों और सीपीयू रजिस्टर में 1 निर्देश में लोड किया जा सके।
#pragma pack(push,1)
struct Bad
{
char a,b,c,d;
};
#pragma pack(pop)
2. आबंटन संरेखण
यह बारीकी से 2 गद्दी तंत्र से संबंधित है पिछले अनुभाग में बताया गया है, तथापि, एक llocation संरेखणmalloc/memalloc के प्रकारों में निर्दिष्ट किया जा सकता आवंटन कार्यों। इसलिए, किसी ऑब्जेक्ट को संरचना/ऑब्जेक्ट प्रकार के बाइट-संरेखण सुझावों की तुलना में किसी ऑब्जेक्ट को आवंटित करना संभव है (आमतौर पर उच्चतम 2) संरेखण सीमा।
size_t blockAlignment = 4*1024; // 4K page block alignment
void* block = malloc(sizeof(T) * count, blockAlignment);
कोड प्रकार टी की गिनती उदाहरणों में से ब्लॉक पतों 4096.
इस तरह के आवंटन संरेखण उपयोग करने का कारण के गुणकों को खत्म हो पर कर रहे हैं फिर से विशुद्ध रूप से वास्तु स्थापित करेंगे। उदाहरण के लिए, पृष्ठ-संरेखित पते से ब्लॉक पढ़ने और लिखना तेज़ है क्योंकि पते की सीमा कैश परतों में अच्छी तरह से फिट होती है। पेज सीमा पार करते समय अलग-अलग 'पृष्ठों' पर विभाजित रेंज कैश को मिटा देती है। विभिन्न मीडिया (बस आर्किटेक्चर) के पास अलग-अलग पहुंच पैटर्न होते हैं और विभिन्न संरेखणों से लाभ हो सकते हैं। आम तौर पर, 4, 16, 32 और 64 के पेज आकार के संरेखण असामान्य नहीं हैं।
देशी प्रकारों के बजाय structs के साथ फिर से प्रयास करें। –
'दिए गए प्रकार के किसी भी उदाहरण के लिए बाइट्स (दो की एक पूर्णांक शक्ति) में संरेखण देता है - http://en.cppreference.com/w/cpp/language/alignof। 'sizeof' बस आकार, बाइट्स में, निश्चित रूप से देता है। – chris
शायद उल्लेख करने लायक है - [आकार हमेशा alignof का एक बहु है] (http://stackoverflow.com/questions/4637774/is-the-size-of-a-struct-required-to-be-an-exact-multiple -ऑफ-द-संरेखण-का-था) – Steve314