好久沒來這里了,一個多月沒來,今天上來,發(fā)現(xiàn)有人對我以前轉(zhuǎn)載的一篇關(guān)于struct對齊的文章提到的東東,提出了很好的質(zhì)疑,我很感謝這位仁兄,關(guān)于這個問題,網(wǎng)上帖子很多,自己看了,覺得也沒啥好整理的,看大牛的吧,以下是各大牛文章的鏈接,我就權(quán)當(dāng)是Mark一下吧,呵呵。
關(guān)于指針和數(shù)組、結(jié)構(gòu)和類的sizeof講解
http://blog.vckbase.com/billdavid/archive/2004/06/23/509.html關(guān)于聯(lián)合體的sizeof講解
http://blog.vckbase.com/smileonce/archive/2005/08/08/10658.html關(guān)于對齊的小結(jié)性文章
http://blog.vckbase.com/zhangjw_cn/archive/2005/08/09/10701.html自己懶得打開鏈接,再把小結(jié)性文章的小結(jié),也拿來轉(zhuǎn)一下。
最后得到了以下結(jié)論:
1. 成員的對齊是按聲明順序進(jìn)行的;
2. 對齊值由編譯指示和最大成員兩者較小的值決定;
3. 未對齊到對齊值的成員一起形成塊對齊(聯(lián)合對齊);
4. 上一個(下一個)對齊采用自己較大則不變,自己較小則填充自己對齊到上一個(下一個)大小;
5. 每成員對齊:如果前面已對齊到對齊值,下一個對齊自己。如果前面未對齊到對齊值,如果加上下一個成員不大于對齊值,下一個對齊自己,否則填充自己塊對齊到對齊值。
6. 最后還未對齊到對齊值的,填充空間塊對齊到對齊值。
從這些結(jié)論,可以得到:
1. 以上的對齊原則其實是盡量整齊排列、盡量節(jié)省內(nèi)存。
2. 聲明成員應(yīng)該盡量避免不同類型錯雜開來,最好采用從小到大或者從大到小的順序(錯開后,會因為上對齊和下對齊而增加填充開銷)。
3. 編譯器缺省采用8字節(jié)對齊主要是因為最大基本類型為8自己(以前自己不明白,在論壇提過問,后來,以為是SSE指令的原因)。
4. 手算sizeof是沒有必要的,負(fù)責(zé)的(可以先對齊出對齊塊,用塊數(shù)乘對齊值)。
posted on 2006-12-27 00:01
frank.sunny 閱讀(643)
評論(0) 編輯 收藏 引用 所屬分類:
C/C++學(xué)習(xí)和實踐