2012-06-19 18 views
5

संरचना के प्रत्येक सदस्य के प्रकार में आमतौर पर एक डिफ़ॉल्ट संरेखण होता है i.e.each संरचना सदस्य पूर्व-निर्धारित सीमा पर गठबंधन होता है। इस कारण गद्दी निम्नलिखित विकी उदाहरण में किया जाता है के लिए:डेटा संरचना संरेखण का पक्ष क्यों है?

struct MixedData 
{ 
    char Data1; 
    short Data2; 
    int Data3; 
    char Data4; 
}; 



struct MixedData /* After compilation in 32-bit x86 machine */ 
{ 
    char Data1; /* 1 byte */ 
    /* 1 byte for the following 'short' to be aligned on a 2 byte boundary 
assuming that the address where structure begins is an even number */ 
    char Padding1[1]; 
    short Data2; /* 2 bytes */ 
    int Data3; /* 4 bytes - largest structure member */ 
    char Data4; /* 1 byte */ 
    char Padding2[3]; /* 3 bytes to make total size of the structure 12 bytes */ 
}; 

(व्यावहारिक) कारण यह है कि संरेखण संरक्षित किया जाना चाहिए क्या है?

+0

संभावित डुप्लिकेट [सी ++ संरचना को कड़ा क्यों नहीं बनाता है?] (Http://stackoverflow.com/questions/6730664/why-doesnt-c-make-the-structure-tighter) –

+2

इस लिंक का संदर्भ लें। इससे आपको यह समझने में मदद मिलेगी कि संरेखण कैसे तेजी से पहुंच संभव बनाता है। http://www.geeksforgeeks.org/archives/9705 –

उत्तर

8

असाइन किए गए पठन और लिखने के लिए आम तौर पर सीपीयू को दो निकटवर्ती शब्दों को स्मृति से (केवल एक के बजाय) लाने और नामित ऑपरेशन को सही तरीके से करने के लिए कुछ अतिरिक्त बिटवाई अंकगणित करने की आवश्यकता होती है।

कुछ आर्किटेक्चर, जैसे कि x86 इसे प्रदर्शन लागत पर अनुमति देगा। अन्य आर्किटेक्चर (सबसे विशेष रूप से एआरएम), या तो एक अपवाद उठाएंगे (आमतौर पर परिणामस्वरूप SIGBUS उपयोगकर्ता प्रक्रिया के लिए सिग्नल) या यहां तक ​​कि "निकटतम" पते को निकटतम सीमा तक भी पहुंचाया जा सकता है जिसके परिणामस्वरूप कुछ बहुत ही खराब बग हो सकती हैं।

+2

आगे, और समवर्ती प्रोग्रामिंग के लिए महत्वपूर्ण, असाइन किए गए पहुंच को परमाणु नहीं बनाया जा सकता है, जबकि गठबंधन किया जा सकता है। –

9

कई आर्किटेक्चर पर, गठबंधन से पढ़ता है और मुख्य स्मृति से लिखता है और लिखता है, उनके असाइन किए गए समकक्षों की तुलना में बहुत तेज है।

+9

और कुछ पर, असाइन किए गए पहुंच प्रतिबंधित है। कुछ आर्किटेक्चर पर – osgx

+4

पर भी एक अपवाद होगा यदि संकलक अनियंत्रित पढ़ने/लिखने के लिए काम करने के लिए कोड उत्पन्न नहीं करता है – mensi

+2

अधिकांश आर्किटेक्चर पर दो पृष्ठों में फैले हुए पहुंच के परिणामस्वरूप एमएमयू अपवाद होगा और इस तरह के मामले को संभालने का एक ऑपरेटिंग सिस्टम सेवा होगा । संरेखण गारंटी के बिना एक कंपाइलर तब प्रोग्रामर प्रयास के बिना कर्नेल का उत्पादन नहीं कर सका। – Potatoswatter

2

आमतौर पर, प्रोसेसर पर निर्भर संरेखण पर संरचना को गठबंधन किया जाता है ताकि प्रोसेसर के प्राकृतिक 'रजिस्टर आकार का उपयोग करके जितनी जल्दी हो सके उन्हें एक्सेस किया जा सके।

32-बिट प्रोसेसर के लिए, यह 4 बाइट्स (या 32-बिट्स) है, 64-बिट प्रोसेसर के लिए यह 8 बाइट्स है।

कुछ (गैर x86) प्रोसेसर एक गलती उत्पन्न करेंगे यदि आप सही सीमा पर गठबंधन नहीं करते हैं तो एक int (कहने) का प्रयास करने का प्रयास करते हैं।

विभिन्न उपकरणों के बीच संचार संरेखण को संरक्षित करने का एक व्यावहारिक कारण है। डिफ़ॉल्ट संरेखण के साथ, यह संरचना 24 बाइट लंबी होगी, जबकि 64-बिट प्रोसेसर पर, यह 48 बाइट्स होगी, और पहले को छोड़कर आइटमों में से कोई भी एक ही स्थान पर नहीं होगा।

सामान्य रूप से एक कंपाइलर/प्रगमा निर्देश के साथ संरचना पैडिंग को बदलना संभव है जो आपके उदाहरण में निर्दिष्ट मैन्युअल पैडिंग की आवश्यकता को अस्वीकार कर सकता है, लेकिन यह आमतौर पर प्रत्येक कंपाइलर के लिए अलग है।