2012-08-02 12 views
12

मेरे ज्ञान के अनुसार, डिफ़ॉल्ट रूप से 4-बाइट संरेखण किया जाएगा। कहते हैं किइस मामले में पैडिंग क्यों नहीं हो रही है?

typedef struct 
{ 
    int data7; 
    unsigned char data8; 
    //3 -bytes will be added here. 
}Sample1; 

तो sizeof(Sample1) हो जाएगा 8.

लेकिन निम्नलिखित संरचना के लिए, क्यों गद्दी हुआ नहीं है ?.

typedef struct 
{ 
    unsigned char data1; 
    unsigned char data2; 
    unsigned char data3; 
    unsigned char data4; 
    unsigned char data5; 
    unsigned char data6; 

}Sample2; 

लेकिन आकार (नमूना 2) केवल 6 है। यह नमूना 2 एक 4 बाइट गठबंधन संरचना नहीं है?

संपादित ::

प्रति विकी के रूप में डाटा संरेखण एक स्मृति शब्द आकार, जो सिस्टम के प्रदर्शन बढ़ जाती है में से कुछ कई के बराबर ऑफसेट पर डेटा डाल का मतलब है की वजह से सीपीयू को स्मृति संभालती है।

लेकिन नमूना 2 के सदस्यों को दो अधिकारों के गुणकों में गठबंधन नहीं किया जाएगा ??

धन्यवाद।

+2

अच्छा प्रश्न +1 – Angus

उत्तर

20

आपकी दूसरी संरचना में से किसी भी फ़ील्ड को 4-बाइट संरेखण की आवश्यकता नहीं है। unsigned char केवल 1-बाइट संरेखण की आवश्यकता है। इसलिए, इसे वास्तव में 4 बाइट्स को संरेखित करने की आवश्यकता नहीं है।

स्ट्रक्चर आमतौर पर केवल सभी क्षेत्रों के अधिकतम संरेखण के लिए गठबंधन होते हैं।

+9

संपादन के लिए: वह "शब्द-आकार" प्रोसेसर के देशी शब्द-आकार के समान नहीं है। यदि डेटाटाइप छोटे होते हैं, तो एक छोटा शब्द-आकार लागू हो सकता है। उदाहरण के लिए, x86 पर, पते पर 'char' तक पहुंचने के लिए कोई प्रदर्शन दंड नहीं है' mod 4! = 0'। लेकिन अगर आप 4-बाइट 'int' को 'mod 4! = 0' के साथ एक्सेस करने का प्रयास करेंगे, तो यह 4-बाइट संरेखण सीमा पार करेगा। – Mysticial

+1

धन्यवाद @ माइस्टिकल। बहुत जरूरी जवाब। यह वही है जो मैं देख रहा हूं। – Jeyaram

5

data7 एक 4-बाइट आइटम है, इसलिए संकलक सामान्य रूप से एक का पता 4.

data1 की एक बहु है कि करने के लिए संरेखित करने का प्रयास करेंगे एक एक बाइट आइटम है, इसलिए संकलक करने की कोशिश नहीं करेंगे इसे किसी विशेष सीमा से संरेखित करें (यानी, ऐसा करने से कोई वास्तविक लाभ नहीं होगा)।

3

नहीं, एक सामान्य कार्यान्वयन में Sample2 4-ब्यूट गठबंधन संरचना नहीं है। यह 1-बाइट गठबंधन संरचना है।

एक सामान्य कार्यान्वयन में, संपूर्ण संरचना की संरेखण आवश्यकता को अधिकतम के रूप में अपने व्यक्तिगत सदस्यों की संरेखण आवश्यकता के रूप में गणना की जाती है। यही कारण है कि अपने Sample1 (अपने मंच पर 4) int के संरेखण की आवश्यकता है, और अपने Sample2unsigned char के संरेखण आवश्यकता है, जो है 1.

1

चार की आवश्यकता है 1 बाइट संरेखण है। अधिकतम डेटा प्रकार char, है जो एक बाइट संरेखण है इसलिए आप आकार को '6' के रूप में प्राप्त कर रहे हैं।

आप अधिक समझ के लिए इस साइट को देख सकते हैं। http://www.geeksforgeeks.org/archives/9705। उन्होंने इसे विस्तार से समझाया है।

संबंधित मुद्दे