c++ - 为什么结构的 sizeof 不等于每个成员的 sizeof 之和?

标签 c++ c struct sizeof c++-faq

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

相关文章:

将 char 数组转换为 struct * 类型

c++ - 现有的标准仿函数/函数来检查是否等于 0?

c++ - 我如何在另一个类的函数中使用在 main 中创建的类的相同实例?

c++ - 使用模板元编程计算数据编译时间

c++ - C/C++ 编译器的最佳编译器警告级别?

c - 使用 Stack 构建时如何包含从 haskell 源文件生成的 'xxx_stub.h' 文件

c - 字符数据类型编译后得到错误的结构大小

c - 从 RubyMotion 访问 C 结构

c++ - 一个结构中的多个点的运算符

c++ - 文本来自 QPushButton 时如何启用 QLineEdit 编辑?