结构体的字节对齐方式(__attribute_pack(packed))#pragma pack())
结构体的字节对齐方式(__attribute_pack(packed))&#pragma pack())
1、编译器的字节对齐方式
当前编译器都有默认的字节对齐方式,
struct PackedStruct {
char a;
int b;
short c;
};
如上代码段中的结构体,在编译运行后发现他的大小并不是7,而是12,这是因为这个编译器默认是四字节对齐。
2、取消字节对齐
__attribute__((packed))
这是 GCC 特定的编译器扩展,用来告诉编译器紧凑地排列结构体的成员,避免使用默认的内存对齐方式。
struct __attribute_pack((packed)) PackedStruct {
char a;
int b;
short c;
};
在增加了__attribute_pack((packed))后,这个结构体的大小变为了7(char:1+int:4+short:2 = 7)
优点:
全局应用:__attribute__((packed))
作用于整个结构体,告诉编译器完全取消对齐填充,将所有成员紧密地排布在一起,按它们声明的顺序紧凑存储。
缺点:
没有灵活的控制:它不允许控制特定字节的对齐边界。也就是说,一旦使用了 packed
,整个结构体都变成了不对齐的状态。
3、设置字节对齐的位数
#pragma pack()
pragma pack
可以按需指定对齐的字节数,比如 1
、2
、4
或 8
字节对齐。这意味着你可以设置对齐到某个特定的字节边界,而不是完全取消对齐。
例子:
#pragma pack(2)
struct PackedStruct {
char a;
int b;
short c;
};
那么这个结构体的大小就变成了8 ----->字节对齐为2;
当 #pragma pack() ,括号中没有参数的时候,代表取消程序员自己设定的字节对齐,但它不是和(__attribute_pack((packed)))一样完全取消,而是变为默认字节对齐方式。