为什么在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字节的整数放在它的旁边,则会违反对齐规则。所以,`b`结尾的额外字节会被跳过,`c`从4字节边界开始。这就导致了额外的大小。

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

更新于:2020年2月11日

167 次浏览

启动你的职业生涯

通过完成课程获得认证

开始学习
广告
© . All rights reserved.