为什么sizeof运算符返回的结构尺寸大于结构成员的总尺寸
这是因为添加了填充以满足对齐约束。数据结构对齐会影响程序的性能和正确性:
- 错误对齐的访问可能是一个硬错误(通常是
SIGBUS) - 错误对齐的访问可能是一个软错误。
- 这两种方法都在硬件上得到了纠正,性能略有下降
- 或通过软件仿真进行纠正,导致性能严重下降
- 此外,原子性和其他并发性保证可能会被破坏,从而导致微妙的错误
下面是一个使用x86处理器典型设置的示例(均使用32位和64位模式):
结构X
{
短s;/*2字节*/
/*2个填充字节*/
int i;/*4字节*/
字符c;/*1字节*/
/*3个填充字节*/
};
结构
{
int i;/*4字节*/
字符c;/*1字节*/
/*1个填充字节*/
短s;/*2字节*/
};
结构Z
{
int i;/*4字节*/
短s;/*2字节*/
字符c;/*1字节*/
/*1个填充字节*/
};
常量int sizeX=sizeof(结构X);/*=12 */
常量int sizeY=sizeof(struct Y);/*=8 */
常量int sizeZ=sizeof(结构Z);/*=8 */
可以通过按对齐方式对成员进行排序(按大小排序足以满足基本类型中的排序)(如上面示例中的结构Z)
重要注释:C和C++标准都表示结构对齐是实现定义。因此,每个编译器可能会选择不同的数据对齐方式,从而导致不同且不兼容的数据布局。因此,在处理将由不同编译器使用的库时,了解编译器如何对齐数据非常重要。某些编译器具有命令行设置和/或特殊的#pragma语句来更改结构对齐设置