2013-05-25 7 views
7

हैलो सब,
मैं जानना चाहता हूं कि संघ पैडिंग का उपयोग करता है या नहीं?
यूनियन के आकार के बाद से सबसे बड़ा डेटा सदस्य आकार है, क्या अंत में पैडिंग हो सकती है?संघ में पैडिंग मौजूद है या नहीं

+1

संक्षेप में, ** हाँ ** !! मेरे विंडोज सिस्टम पर, एक यूनियन को आकार देने के लिए गद्देदार है जो 'int', यानी ** 4 बाइट्स ** के आकार का एक बहु है। तो जब तक आप '#pragma पैक (1) 'का उपयोग करें, आकार के 3 बाइट वाले यूनियन को 4 बाइट्स उत्पन्न करने के लिए एक और बाइट के साथ गद्देदार किया जाएगा। एक प्रोग्राम लिखें और प्रश्न पोस्ट करने से पहले इसे आजमाएं। –

+0

"एक यूनियन को आकार देने के लिए गद्देदार है जो एक int के आकार का एक बहु है, यानी 4 बाइट्स।" लेकिन इस मामले में यूनियन अब { चार ए; } ए; आकार 1 – akash

+1

है यदि आपके मामले में कोई पैडिंग नहीं है। किसने कहा कि 'पैडिंग' हमेशा किया जाता है? जैसे डैनियल फिशर ने कहा, यह ** मानक द्वारा ** अनिवार्य ** नहीं है। –

उत्तर

-3

संघ जब हम आदिम प्रकार के साथ प्रयोग के अंदर यह

union 
{ 
    char c; 
    int x; 
} 

ऐसा लगता है जैसे कि यह गद्दी का उपयोग नहीं करता, क्योंकि सबसे बड़े आकार डेटा वैसे भी सीमा के अनुरूप किया जाता है।

लेकिन जब हम संघ के भीतर एक संरचना घोंसला करते हैं तो यह करता है।

union u 
    { 
     struct ss 
     { 
      char s; 
      int v; 
     }xx; 
    }xu; 

यह आकार 8.

के परिणामस्वरूप अपने प्रश्न के लिए तो जवाब देने के गद्दी संघ में persent है।

+1

उस स्थिति में, आपके पास पहले से ही 'struct' में पैडिंग है। –

+0

जैसा कि डैनियल ने सुझाव दिया कि यह गलत है। आप संघ के पैडिंग के रूप में संरचना के पैडिंग का जिक्र कर रहे हैं जो भ्रामक है। – kadina

14

संघ के आकार के बाद से सबसे बड़ा डेटा सदस्य आकार

जरूरत है कि सच नहीं हो रहा है।

union Pad { 
    char arr[sizeof (double) + 1]; 
    double d; 
}; 

उस संघ का सबसे बड़ा सदस्य arr पर विचार करें। लेकिन आमतौर पर, double को चार या आठ बाइट्स के एकाधिक पर गठबंधन किया जाएगा (आर्किटेक्चर और double के आकार पर निर्भर करता है)। कुछ आर्किटेक्चर पर, यह भी जरूरी है क्योंकि वे असाइन किए गए पढ़ने का समर्थन नहीं करते हैं।

तो sizeof (union Pad) आमतौर पर sizeof (double) + 1 [आम तौर पर 64-बिट सिस्टम पर 16 = 2 * sizeof (double) से बड़ा है, और या तो 16 या 12 32-बिट सिस्टम (8 बिट char और 64-बिट double साथ एक 32-बिट सिस्टम पर पर, आवश्यक double के लिए संरेखण अभी भी केवल चार बाइट हो सकता है)]।

इसका मतलब है कि संघ में पैडिंग होना चाहिए, और इसे केवल अंत में रखा जा सकता है।

आम तौर पर, union का आकार किसी भी सदस्य द्वारा आवश्यक सबसे बड़े संरेखण का सबसे छोटा बहुमत होगा जो सबसे बड़े सदस्य से छोटा नहीं है।

+0

लेकिन जब हमारे पास यूनियन में अकेले char arr [sizeof (double) +1] है तो यह केवल आकार देता है: 9? – Dineshkumar

+0

यह मानक द्वारा अनिवार्य नहीं है, एक कार्यान्वयन को पैडिंग जोड़ने की अनुमति है, लेकिन सामान्य रूप से (8-बाइट 'डबल' के साथ), हाँ, यह 9 का आकार देगा। –

+0

क्या कोई यह दिखाता है कि यह उदाहरण दिखाएगा कि यह उदाहरण पैड अप? - पूछना क्योंकि मुझे नहीं लगता कि यहां पैड के लिए _any_ कारण है, ऐसा नहीं है कि दोनों सदस्यों के बीच जगह होने की आवश्यकता है, इसे केवल सबसे बड़ा चुनना चाहिए। – ideasman42

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