C 位元組對齊 pragma pack

2021-07-03 23:55:05 字數 1075 閱讀 1074

對於結構體,編譯器會自動進行成員變數對齊處理,是為了提高運算效率。

預設情況下是自然對齊方式。

即預設對齊,按照結構體的成員中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 條件分配空間。各個成員按照它們被宣告的順序在記憶體中順序儲存 成員之間可能有插入的空位元組 第乙個成員的位址和整個結構的位...