为什么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 */
    

    通过按对齐方式对成员排序(按基本类型中的大小就足以进行排序)(例如上例中的结构Z),可以使结构的大小最小化。

    重要说明:C和C++标准均声明结构对齐方式是实现定义的。因此,每个编译器可能选择不同地对齐数据,从而导致不同且不兼容的数据布局。因此,在处理将由不同编译器使用的库时,了解编译器如何对齐数据非常重要。一些编译器具有命令行设置和/或特殊的#pragma语句来更改结构对齐设置。

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

    10-13 06:37
    查看更多