結構體位元組對齊

2021-08-02 03:19:06 字數 607 閱讀 4527

牢記兩條基本規則

規則一:基本成員對齊

第乙個放在偏移為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運算子求算某結構體所佔空間時,並不是簡單地將結構體中所有元素各自佔的空間相加,這裡涉及到記憶體位元組對齊的問題。從理論上講,對於任何 變數的訪問都可以從任何位址開始訪問,但是事實上不是如此,實際上訪問特定型別的變數只能在特定的位址訪問,這就需要各個變數在空間上按一定的規則排列,而不是...