1. 程式人生 > >C語言結構體對齊與不對齊設定總結

C語言結構體對齊與不對齊設定總結

相信不同的編譯平臺間的預設設定差異給大家帶來了很多困擾。在此,僅就結構體對齊解析下之間的差異設定方法。

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,則按照最大成員的長度來對齊