全面的基础微网站开发,网站如何诊断,网站建设平台安全问题有哪些,响应式网站的设计趋势结构体的字节对齐方式#xff08;__attribute_pack(packed))#pragma pack())
1、编译器的字节对齐方式
当前编译器都有默认的字节对齐方式#xff0c;
struct PackedStruct {char a;int b;short c;
};如上代码段中的结构体#xff0c;在编译运行后发现他的大小并不…结构体的字节对齐方式__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))后这个结构体的大小变为了7char:1int:4short: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)))一样完全取消而是变为默认字节对齐方式。