2016-04-14 2 views
10

मैंने चरम "sample_union" के लिए 4100 बाइट आवंटित एक संघ घोषित किया है और 4104 बाइट आवंटित संरचना के हिस्से के रूप में एक ही संघ घोषणा की है।संरचनाओं और संघों के बीच एक आकार का मिलान क्यों है?

union test_size_union { 
    struct { 
     uint8_t type; 
     union { 
      uint8_t count; 
      uint8_t list; 
     }; 
     uint16_t rc; 
     uint16_t arr_value[2048]; 
    }; 
    uint64_t first_dword; 
}__attribute__((packed)) sample_union ; 

उपर्युक्त संघ के अंदर संरचना को 4104 बाइट आवंटित करना है।

struct test_size_struct { 
    union { 
     struct { 
      uint8_t type; 
      union { 
       uint8_t count; 
       uint8_t list; 
      }; 
      uint16_t rc; 
      uint16_t arr_value[2048]; 
     }; 
     uint64_t first_dword; 
    }; 
}__attribute__((packed)) sample_struct; 

खैर, यह एक परियोजना आवश्यकता नहीं है, लेकिन मुझे पता है क्यों संकलक इस दो घोषणा के लिए अलग तरह से बर्ताव कर रही है चाहते हैं।

जीसीसी संस्करण: (जीसीसी) 4.9.2, x86_64

मंच: लिनक्स, x86_64

+0

ध्यान दें कि अज्ञात structs को C++ मानक द्वारा अनुमति नहीं है (जीसीसी इसे एक एक्सटेंशन के रूप में प्रदान करता है)। – user2079303

+0

यह मुख्य कार्य करता है: int मुख्य (शून्य) { printf ("sample_union =% d \ n", sizeof (sample_union) का आकार); printf ("sample_struct =% d \ n" आकार, आकार (sample_struct)); वापसी 0; } उत्पादन: sample_union की आकार = 4100 sample_struct = 4104 – user50

+1

@JoachimPileborg की का आकार: सरणी, uint16_t [2048] 'के प्रकार' है, इसलिए अधिकांश मशीनों पर 4096 बाइट्स लेता है। – DarkDust

उत्तर

11

जब आप struct के अंदर संघ रखा, तो आप packed रूप संघ निशान नहीं था। अनपॅक किए गए यूनियन में थोड़ा पैडिंग (चार बाइट्स) है ताकि इसका आकार uint64_t के आकार का एक बहु हो।

पैक किए गए संघ में यह पैडिंग नहीं है, इसलिए यह छोटा है।

एक साइड अवलोकन के रूप में, संघ के अंदर अज्ञात संरचना packed चिह्नित नहीं है। ऐसा नहीं होता है कि इस मामले में कोई फर्क नहीं पड़ता, क्योंकि सब कुछ अच्छी तरह से गठबंधन है - लेकिन यह कुछ पता होना चाहिए।

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