牢記兩條基本規則
規則一:基本成員對齊
第乙個放在偏移為0的地方;以後的每個成員按min(指定對齊長度, 自身長度)對齊;
其中, 基本成員指的是機器所能識別的最小資料型別(整型、浮點型、指標等),不包含重新定義的資料型別及組合的資料型別,即如果結構體內包含陣列或者是巢狀了結構, 需要將其原樣展開。
struct
test;
基本成員不是陣列a, 而是陣列的單個元素,即a[0]、a[1]...
即基本成員對齊長度是char,即1, 而不是5
規則二:結構體整體對齊
min(指定對齊長度, 最大成員長度)對齊,不足末尾補齊。
指定對齊長度,預設同機器位數,如32位機器,就是4位元組
一般地,可以通過偽指令#pragma pack(n)來改變預設的對齊:
#pragma pack(n),編譯器將按照n個位元組對齊;
#pragma pack(),取消自定義位元組對齊方式。
結構體位元組對齊
include pragma pack 2 struct t.pragma pack int main int argc,char argv 最後輸出的結果為 8。這個表示是按照2位元組來對齊資料,首先分配2位元組給成員變數i,分配完成後,還剩一位元組,zj add補0 沒法容納成員變數d,此時會再...
結構體位元組對齊
include pragma pack 2 struct t.pragma pack int main int argc,char argv 最後輸出的結果為 8。這個表示是按照2位元組來對齊資料,首先分配2位元組給成員變數i,分配完成後,還剩一位元組,zj add補0 沒法容納成員變數d,此時會再...
結構體位元組對齊
在用sizeof運算子求算某結構體所佔空間時,並不是簡單地將結構體中所有元素各自佔的空間相加,這裡涉及到記憶體位元組對齊的問題。從理論上講,對於任何 變數的訪問都可以從任何位址開始訪問,但是事實上不是如此,實際上訪問特定型別的變數只能在特定的位址訪問,這就需要各個變數在空間上按一定的規則排列,而不是...