C語言結構體對齊與不對齊設定總結
阿新 • • 發佈:2019-02-02
相信不同的編譯平臺間的預設設定差異給大家帶來了很多困擾。在此,僅就結構體對齊解析下之間的差異設定方法。
1.gcc中結構體預設是4個位元組對齊,即為32的倍數。
1.1修改位元組對齊:
struct data{
int a;
char b;
char c;
}__attribute__((aligned(8))) data;
或
#pragma pack(8)
struct data{
int a;
char b;
char c;
}data;
#pragma pack()
1.2取消位元組對齊:
struct data{
int a;
char b;
char c;
}__attribute__((packed)) data;
2.vs中結構體預設是1個位元組對齊,即為8的倍數。
修改位元組對齊:
#pragma pack(8)
struct data{
int a;
char b;
char c;
}data;
#pragma pack()
以上均可以用sizeof函式驗證其大小。
綜上所述:
用來對齊的,包括棧對齊,變數地址對齊記憶體分配對齊的幾種方式如下:
#pragma pack(n)
n的取值可以為1、2、4、8、16,在編譯過程中按照n個字結對齊
#pragma pack()
取消對齊,按照編譯器的優化對齊方式對齊
__attribute__ ((packed));
是說取消結構在編譯過程中的優化對齊。
__attribute__ ((aligned (n)));
讓所作用的成員對齊在n位元組自然邊界上,如果結構中有成員的長度大於n,則按照最大成員的長度來對齊