昨天和wub討論,為什么struct對(duì)齊的時(shí)候,double類型的地址要以8對(duì)齊。
對(duì)齊的目的就是為了方便和加速處理器讀取,那么只需要和字長對(duì)齊就可以了。
根據(jù)這兩篇文章:
《內(nèi)存對(duì)齊與ANSI C中struct型數(shù)據(jù)的內(nèi)存布局》vs
《難以理解的《內(nèi)存對(duì)齊與ANSI C中struct型數(shù)據(jù)的內(nèi)存布局》》gcc和vc下是不同的。對(duì)于double類型,默認(rèn)gcc的對(duì)齊模數(shù)是4,VC是8.
內(nèi)存對(duì)齊是與處理器,編譯器,編譯選項(xiàng)相關(guān)的,因此單純給出一個(gè)struct,問其sizeof是多少,這樣的問法是不嚴(yán)謹(jǐn)?shù)摹;卮鹪搯栴},應(yīng)該加以說明運(yùn)行環(huán)境。
vc的默認(rèn)對(duì)齊模數(shù)是:sizeof(該類型)
gcc的默認(rèn)對(duì)齊規(guī)則是: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;
};
起初我認(rèn)為c以后不需要填充,因此gcc下sizeof(s)=8+1 = 9。但事實(shí)應(yīng)該是sizeof(s)==8+4 = 12。
因?yàn)閷?duì)于數(shù)組來說,要保證數(shù)組的大小等于數(shù)組的個(gè)數(shù)乘以元素的大小。因此c之后也是需要填充的,這樣后續(xù)的元素的地址才會(huì)是字長的倍數(shù)。