为什么在 C/C++ 中,结构体的 sizeof 不等于其每个成员 sizeof 的总和?


结构体 sizeof 与其每个成员 sizeof 之和的差异是由于字节填充和对齐造成的。C/C++ 中的每种数据类型都有对齐要求。处理器将具有其体系结构的处理字长。在 32 位机器上,处理字大小将为 4 字节或 32 位。例如,如果您有以下结构体:

示例

#include <iostream>
using namespace std;
struct X
{
   char b[3];
   int c;
};
int main()
{
   char b[3];
   int c;
   int total = sizeof(b) + sizeof(c);
   cout << sizeof(X) << endl;
   cout << total;
}

输出

这将输出:

8
7

在我的 64 位机器上。为什么会这样?这是因为在结构体中,它获取字符数组并将其放入内存,但如果它将大小为 4 字节的 int 放置在其旁边,则会违反对齐规则。因此,跳过 b 结尾处的额外字节,c 从 4 字节边界开始。这会导致额外的空间。

您可以在 https://en.wikipedia.org/wiki/Data_structure_alignment. 了解更多关于这些规则的信息。

更新于: 2020年2月11日

167 次浏览

开启您的 职业生涯

通过完成课程获得认证

开始学习
广告

© . All rights reserved.