2015-04-02 8 views
5

संकलनकर्ता आम तौर पर संरेखण प्रतिबंध को पूरा करने के ढांचे पर गद्दी अनुगामी जब वे सरणियों में उपयोग किया जाता है सम्मिलित करें:पीछे चल गद्दी

struct AB { 
    struct { 
     uint16_t x; 
     uint8_t y; 
    } xy; 
    uint8_t z; 
}; 

:

// Size 4, alignment 2 
struct A { 
    uint16_t x; 
    uint8_t y; 
    // Padding 1 byte 
}; 

// Size 6, alignment 2 
struct B { 
    struct A xy; 
    uint8_t z; 
    // Padding 1 byte 
}; 

अब इन का उपयोग कर आंतरिक संरचना के संयोजन पर विचार संरेखण प्रतिबंधों को तोड़ने के दौरान, 4 बाइट्स में फिट हो सकता है। इसके अलावा, आंतरिक संरचना xy में कोई प्रकार नहीं है जिसका उपयोग कहीं और किया जा सकता है, इसलिए इसके लिए पिछली पैडिंग की आवश्यकता नहीं है।

पहलू यह है कि सदस्य xystruct A के साथ असंगत होगा, लेकिन वहाँ कोई कारण नहीं क्यों यह रूप में वे अलग प्रकार परिभाषाओं में हैं होना चाहिए।

क्या संकलक इस आकार अनुकूलन को करने की अनुमति देता है?

या, इसे अन्य तरीके से रखने के लिए, क्या मानक की आवश्यकता है कि बराबर सदस्यों के साथ 2 संरचनाओं का हमेशा बराबर लेआउट होगा?

+0

मुझे लगता है कि संकलक को ऐसा करने की अनुमति दी जाएगी, क्योंकि मानक को पैड संरचनाओं के लिए कंपाइलर की आवश्यकता नहीं होती है। – qbt937

उत्तर

1

उत्तर संगत प्रकार की धारणा द्वारा दिया गया है। यदि t1 और t2 संगत प्रकार हैं, तो t1 पर एक पॉइंटर का उपयोग t2 टाइप करके सेट की गई मेमोरी तक पहुंचने के लिए किया जा सकता है।

C11 मानक में:

6.2.7 संगत प्रकार और समग्र प्रकार

  1. ... इसके अलावा, दो संरचना, संघ, या प्रगणित प्रकार अलग अनुवाद इकाइयों में घोषित करता है, तो संगत हैं उनके टैग और सदस्य निम्न आवश्यकताओं को पूरा करते हैं: यदि किसी को टैग के साथ घोषित किया जाता है, तो अन्य उसी टैग के साथ घोषित किया जाएगा। यदि दोनों अपनी संबंधित अनुवाद इकाइयों के भीतर कहीं भी पूरा हो जाते हैं, तो निम्नलिखित अतिरिक्त आवश्यकताएं लागू होती हैं: उनके सदस्यों के बीच एक-एक-एक पत्राचार होगा कि संबंधित सदस्यों की प्रत्येक जोड़ी संगत प्रकारों के साथ घोषित की जाती है; यदि जोड़ी के एक सदस्य को संरेखण विनिर्देशक के साथ घोषित किया जाता है, तो दूसरे को समकक्ष संरेखण विनिर्देशक के साथ घोषित किया जाता है; और यदि जोड़ी के एक सदस्य को नाम के साथ घोषित किया जाता है, तो दूसरे को उसी नाम से घोषित किया जाता है। ...

दो structs कि एक ही टैग की जरूरत नहीं है संगत प्रकार नहीं कर रहे हैं, और मैं कुछ भी है कि उन्हें एक ही लेआउट करने के लिए मजबूर नहीं दिख रहा।

+1

वास्तव में, मैं भी यही सोच रहा था। यह देखने के लिए अच्छा है कि कोई और एक ही निष्कर्ष पर आया था। – user694733

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