2016-04-14 81 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字節。嗯,這不是項目需求,但我想知道爲什麼編譯器在這兩個聲明中表現不同。

gcc版本:(GCC)4.9.2,x86_64的

平臺:Linux,x86_64的

+0

請注意,C++標準不允許使用匿名結構(GCC確實將它作爲擴展提供)。 – user2079303

+0

這主要功能: int main(void) { printf(「sample_union =%d \ n」的大小,sizeof(sample_union)); (「sample_struct的大小=%d \ n」,sizeof(sample_struct)); return 0; } 輸出:sample_union的 大小= 4100 大小sample_struct = 4104 – user50

+1

@JoachimPileborg的:該數組是類型的'uint16_t [2048]',所以佔用了在大多數機器4096個字節。 – DarkDust

回答

11

當你放在裏面結構的結合,你沒有標註工會packed。解壓後的union有一個小填充(四個字節),所以它的大小是uint64_t大小的倍數。

包裝聯合不具備此填充,因此它更小。

作爲一個側面觀察,聯盟內部的匿名結構未標記爲packed。這種情況在這種情況下並不重要,因爲無論如何,一切都很好地對齊 - 但這是需要注意的事情。