昨天和wub討論,為什么struct對齊的時候,double類型的地址要以8對齊。
對齊的目的就是為了方便和加速處理器讀取,那么只需要和字長對齊就可以了。
根據這兩篇文章:
《內存對齊與ANSI C中struct型數據的內存布局》vs
《難以理解的《內存對齊與ANSI C中struct型數據的內存布局》》gcc和vc下是不同的。對于double類型,默認gcc的對齊模數是4,VC是8.
內存對齊是與處理器,編譯器,編譯選項相關的,因此單純給出一個struct,問其sizeof是多少,這樣的問法是不嚴謹的。回答該問題,應該加以說明運行環境。
vc的默認對齊模數是:sizeof(該類型)
gcc的默認對齊規則是:byte為1,char為2,其他均為4.
由上可知
struct s{
?char c;
?double d;
};
gcc下
sizeof(s) = 4+8 = 12
vc下
sizeof(s) = 8+8 = 16
那么 struct s{
double d;
char c;
};
起初我認為c以后不需要填充,因此gcc下sizeof(s)=8+1 = 9。但事實應該是sizeof(s)==8+4 = 12。
因為對于數組來說,要保證數組的大小等于數組的個數乘以元素的大小。因此c之后也是需要填充的,這樣后續的元素的地址才會是字長的倍數。