2016-04-14 18 views
10

"sample_union" değişkenine 4100 bayt ayıran bir birlik bildirdim ve 4104 bayt ayıran bir yapının parçası olarak aynı birliği bildirimi yaptı.Yapılar ve sendikalar arasında neden bir uyumsuzluk var?

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 ; 

Yukarıdaki birleşimi iç yapının içine yerleştirmek 4104 bayt ayırıyor.

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; 

Eh, bu proje gereklilik değildir, ama derleyici bu iki beyanı için farklı davranmadığı neden bilmek istiyorum.

gcc version: (GCC) 4.9.2, x86_64

Platform: Linux x86_64

Eğer yapı içine birliği yerleştirilen
+0

Anonim yapıların C++ standardı tarafından izin verilmediğini unutmayın (GCC bunu bir uzantı olarak sağlar). – user2079303

+0

Bu temel işlevler: int main (void) { printf ("sample_union boyutu =% d \ n", sizeof (sample_union)); printf ("sample_struct boyutu =% d \ n", sizeof (sample_struct)); geri dönüş 0; } çıkışı: sample_union arasında boyutu = 4100 sample_struct = 4104 – user50

+1

@JoachimPileborg arasında boyutu: dizi, [2048] 'uint16_t 'tiptedir bu yüzden çoğu makinelerde 4096 bayt alır. – DarkDust

cevap

11

, sen packed olarak birliği işareti vermedi. Paketlenmemiş birleşim, boyutunun uint64_t boyutunun katları kadar olması için küçük bir dolguya (dört bayt) sahiptir.

Paketlenmiş birleşim bu dolguya sahip değil, bu nedenle daha küçüktür.

Bir yan gözlem olarak, kaynağın içindeki anonim yapı packed işaretli değil. Bu durumda önemli değil, çünkü her şey her neyse güzelce hizalanmış - ama farkında olmak için bir şey.