struct成員對齊小解

2021-04-12 22:50:32 字數 1462 閱讀 3144

修正:2023年5月20日

先來看一段**:

struct a ;

struct b ;

struct c ;

int main(void)

編譯及執行結果:

qdieyou@qdieyou /cygdrive/e/gcc

$ gcc -o size_struct size_struct.c

qdieyou@qdieyou /cygdrive/e/gcc

$ ./size_struct816

41、    自然對齊:

以結構體成員中最長的成員的長度為準來對齊:

以結構體c為例:所有成員中,最長的佔4個位元組(int型別)所以對齊是以4位元組為準的。由於char a,char c兩個空間加起來沒超過4,所以a,c兩個作為乙個整體來對齊。所以總長度為4+4 = 8。(如果再來乙個char d緊跟char c之後的話,結構體所佔的空間還是8。但如果不是緊跟char型別之後,而是跟int後的,那長度就不一樣了);

以結構體a為例:所有成員中,最長的佔4個位元組(long型別),所以其他成員都以4對齊,(佔不了4個位元組的,後面以空符號填充)。

在結構體b中,包含了成員為結構體a的型別,此時並不是以結構體a的長度來對齊,而是以結構體a中最長成員(最長的基本資料型別)的長度來對齊。

2、    指定對齊

• 使用偽指令#pragma pack (n),編譯器將按照n 個位元組對齊;

• 使用偽指令#pragma pack (),或#pragma pack (0)取消自定義位元組對齊方式。

說明:n應該為2的次方,否則編譯器會給出警告。

當n大於結構體所有成員的長度時,指定失效,即此時仍然按自然對齊方式進行對齊。

(注:如果還不理解,上機測試以下就知道了,嘿嘿!!!)

以下再看幾個例子:

例子1:

#pragma pack(2)

struct a ;

int main(void)

編譯及執行結果:

qdieyou@qdieyou /cygdrive/e/gcc

$ gcc -o size_struct size_struct.c

qdieyou@qdieyou /cygdrive/e/gcc

$ ./size_struct

6例子2:

#pragma pack(3)

struct a ;

int main(void)

編譯及執行結果:

qdieyou@qdieyou /cygdrive/e/gcc

$ gcc -o size_struct size_struct.c

size_struct.c:26: warning: alignment must be a **all power of two, not 3

qdieyou@qdieyou /cygdrive/e/gcc

$ ./size_struct

8

struct的成員對齊

struct 的成員對齊 intel 微軟等公司曾經出過一道類似的面試題 include pragma pack 8 struct example1 struct example2 pragma pack int main int argc,char argv 問程式的輸入結果是什麼?答案是 8 1...

struct的成員對齊

1struct 的成員對齊 intel 微軟等公司曾經出過一道類似的面試題 include pragma pack 8 struct example1 struct example2 pragma pack int main int argc,char argv 問程式的輸入結果是什麼?答案是 8 ...

struct成員對齊問題

struct的成員對齊 include pragma pack 8 struct example1 short a long b struct example2 char c example1 struct1 short e pragma pack int main int argc,char ar...