sizeof:(含位域)結構體內存對齊,壓縮存儲
在此特別感謝在百度知道里幫我解答疑惑的confuciuskg。注:沒有額外聲明的結果均是在VC++環境中測試得到的結果。
1. sizeof 給出其操作數存儲字節大小。





























作用:一是簡化處理器與內存之間傳輸系統的設計(這個我是不懂的);二是提升讀取數據的速度。
對齊準則:
對于VC:
a. 結構體變量的首地址能被其最寬數據類型成員的大小所整除。這個最寬數據類型大小作為對齊模數。
b. 結構體每個成員相對于結構體首地址的偏移量(offset)都是這個成員大小的整數倍。
c. 結構體的總大小對齊模數的倍數。
對于GNU GCC:
區別是其對齊模數對大只能是4,根據上面的原則得出大于4的值時以4替代。


















注意:一個位域必須存儲在同一個字節中,不能跨字節。一個位域必須存儲在同一個字節中,不能跨兩個字節。如一個字節所剩空間不夠存放另一位域時,應從下一單元起存放該位域。也可以有意使某位域從下一單元開始。(從這里也能看出一個位域不能超過8)。
4.含位域結構體內存對齊:
a. 如果相鄰位域類型相同,位寬之和小于類型的sizeof大小,則后面的字段緊鄰前一個字段存儲,直到不能容納為止;
b. 如果相鄰位域類型相同,位寬之和大于類型的sizeof大小,則后面的字段將從新的存儲單元開始,其偏移量為其類型大小的整數倍;
c. 如果相鄰位域類型不用,則vc6采取不壓縮方式,dev-c++ 和GCC都采取壓縮方式。
5. 非壓縮存儲:








6. 嵌套結構體的sizeof: 對齊模數的選擇只能是根據基本數據類型,所以對于結構體中嵌套結構體,只能考慮其拆分的基本數據類型。對于對齊準則中的第2條,也是根據內層結構體中基本數據類型的最寬長度(而不是網上大量轉載的要將整個結構體看成是一個成員,成員大小按照該結構體根據對齊準則判斷所得的大小)。給個例子予以說明:






























7. 類對象的sizeof:類對象在內存中存放的方式和結構體類似,這里就不再說明。需要指出的是,類對象的大小只是包括類中非靜態成員變量所占的空間,因為靜態變量的存儲位置與結構或者類的實例地址無關。如果有虛函數,那么再另外增加一個指針所占的空間即可。
8. 一些修改對齊模數的命令
#pragma pack(push) //保存對齊狀態
#pragma pack(n) /設置對齊模數(選擇n和一般情況下選出來的模數的較小者做對齊模數)
#pragma pack(pop) //恢復對齊狀態
posted on 2009-04-25 11:33 幸運草 閱讀(3348) 評論(0) 編輯 收藏 引用 所屬分類: C++