1

在VC++中,爲什麼編譯器只在使用非char數據類型時填充struct?C++編譯器對齊 - 只是字符沒有填充

I.e.

struct TEST 
{ 
    char a[7]; 
}; 

struct TEST2 
{ 
    __int32 a; 
    char b[7]; 
}; 

sizeof(TEST); // Returns 7 
sizeof(TEST2); // Returns 12 
+4

這完全是編譯器特有的。你在測試什麼編譯器? – templatetypedef

+0

哦,沒有意識到! VC++。 – Qix

回答

2

這歸結爲事實,即sizeof(char) == 1 - 總是。

數組必須是連續的,所以在一個char數組中(如果它足夠大),最終會得到每個可能對齊的元素。由於編譯器/硬件使其工作,有不能是需要插入填充來處理char在某事像struct要麼。

現在,這並不是說編譯器不能插入填充。例如,即使使用char數組,也可以通過這樣做來提高性能。例如,給定你的struct定義,編譯器將你的7個字符的數組再加上一個來構造結構體8的大小是完全可以接受的 - 這是一個漂亮的2的整數次方。

在某些硬件,你很可能會看到這一點。碰巧,由VC++支持的英特爾硬件並沒有真正從這樣的事情中獲益,所以你不太可能在那裏看到它。

+0

這是有道理的。沒有char數組的相同作品(即'char c1,c2,...')。 – Qix

+1

@ Di-0xide:不是真的 - 兩個單獨定義的char不需要是連續的。在一個數組中,它們*必須是連續的(例如,如果數組中的第一個字符在xxxx0處,那麼下一個字符*必須在xxxx1處)。 –

+0

哦有趣的 - 不,我指的是編譯器執行的填充。至少在這種情況下,我收到了相同的測試結果。 – Qix