對於結構體,編譯器會自動進行成員變數對齊處理,是為了提高運算效率。
預設情況下是自然對齊方式。
即預設對齊,按照結構體的成員中size最大的成員進行對齊。
例:
struct naturalalign
;
上述結構體,成員size最大的是c,sizeof(c)為4,因此,結構體中的成員都以4為單位進行對齊,sizeof(naturalalign)為12.
即按照指定的位元組大小進行對齊。
使用偽指令:
#pragma pack(n); //按照n個位元組進行對齊
#pragma pack();//取消指定對齊
注: 如果n大於結構體中最大成員的size,則不起作用。仍然以預設方式對齊。
例:
#pragma pack(n)
struct natural
;#pragma pack();
當n分別為4,8,16時,其對齊方式是一樣的。sizeof(natural)都為12;
當n為2時,sizeof(natural)為6.
#pragma pack(8)
struct example1
;struct example2
;#pragma pack();
int main(int argc,char*argv)
問:程式輸出結果?
分析:
struct example1中成員最大size為4,故指定對齊8不起作用。
sizeof(example1) = 4*2 = 8;
struct example2中包含struct example1,其本身成員最大size為2,而example1中的成員最大size為4,指定對齊8也不起作用。,
sizeof ( example2 ) = 4*4 = 16;
由於struct example2中成員以4為單位對界,因此,char變數c後應該補充3個bit,後面才是struct1的位址,故最後輸出結果為4. 位元組對齊 pragma pack
這是給編譯器用的引數設定,有關結構體位元組對齊方式設定,pragma pack是指定資料在記憶體中的對齊方式。pragma pack n 作用 c編譯器將按照n個位元組對齊。pragma pack 作用 取消自定義位元組對齊方式。pragma pack push,1 作用 是指把原來對齊方式設定壓棧...
C語言的位元組對齊及 pragma pack的使用
posted on 2010 04 15 11 14 delcpp 閱讀 623 編輯收藏 c編譯器的預設位元組對齊方式 自然對界 在預設情況下,c編譯器為每乙個變數或是資料單元按其自然對界條件分配空間。在結構中,編譯器為結構的每個成員按其自然對界 alignment 條件分配空間。各個成員按照它們...
C語言的位元組對齊及 pragma pack的使用
c編譯器的預設位元組對齊方式 自然對界 在預設情況下,c編譯器為每乙個變數或是資料單元按其自然對界條件分配空間。在結構中,編譯器為結構的每個成員按其自然對界 alignment 條件分配空間。各個成員按照它們被宣告的順序在記憶體中順序儲存 成員之間可能有插入的空位元組 第乙個成員的位址和整個結構的位...