修正: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...