为什么sizeof运算符返回的结构大小大于结构成员的总大小?

最佳答案

这是因为添加了填充以满足对齐约束。Data structure alignment影响程序的性能和正确性:
错误对齐的访问可能是一个硬错误(通常SIGBUS)。
错误对齐的访问可能是一个软错误。
或者在硬件上进行修正,使性能适度下降。
或通过软件仿真进行修正,导致性能严重下降。
此外,原子性和其他并发性保证可能会被破坏,从而导致微妙的错误。
下面是一个使用x86处理器典型设置的示例(均使用32位和64位模式):

struct X
{
    short s; /* 2 bytes */
             /* 2 padding bytes */
    int   i; /* 4 bytes */
    char  c; /* 1 byte */
             /* 3 padding bytes */
};

struct Y
{
    int   i; /* 4 bytes */
    char  c; /* 1 byte */
             /* 1 padding byte */
    short s; /* 2 bytes */
};

struct Z
{
    int   i; /* 4 bytes */
    short s; /* 2 bytes */
    char  c; /* 1 byte */
             /* 1 padding byte */
};

const int sizeX = sizeof(struct X); /* = 12 */
const int sizeY = sizeof(struct Y); /* = 8 */
const int sizeZ = sizeof(struct Z); /* = 8 */

可以通过按对齐方式对成员进行排序(按大小排序对于基本类型来说已经足够了)来最小化结构的大小(如上例中的structureZ)。
重要提示:C和C++标准都表示结构对齐是实现的定义。因此,每个编译器可能会选择不同的数据对齐方式,从而导致不同且不兼容的数据布局。因此,在处理将由不同编译器使用的库时,了解编译器如何对齐数据非常重要。有些编译器具有命令行设置和/或特殊的#pragma语句来更改结构对齐设置。

关于c++ - 为什么结构的sizeof不等于每个成员的sizeof之和?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42018532/

10-11 22:33
查看更多