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