是 sizeof() 递归的

Is sizeof() recursive?

本文关键字:递归 sizeof      更新时间:2023-10-16

答案应该很简单,但我想确定一下。

sizeof()递归吗?例如

struct foo
{
   DWORD a;
   DWORD b;
};
struct bar
{
   DWORD c;
   foo d;
};

sizeof(bar)是否包含 foo 的大小,返回完整的 12 个字节(假设 DWORD 是 4 个字节)?

是的... sizeof给出了直接包含在类型中的所有成员的总数,包括struct/class数据成员、非虚拟基类、一些跟踪虚拟基的实现定义的链接/计数器、虚拟调度表指针、帮助对齐数据成员以实现 CPU 安全或高效访问的填充,以及理论上实现可能想要放入的任何其他内容! (例如,用于运行时调试/错误检测的东西,垃圾收集的非标准支持......

当然,它不包括指向或引用对象的大小,但包括这些指针和引用的大小。

是的,sizeof 运算符为您提供了结构的大小,包括其所有成员。

但请注意,编译器可能会添加自己的填充,因此实际大小可能/可能不等于结构成员的大小之和。

是的。摘自ISO/IEC 9899:TC3:

当应用于具有结构或联合类型的操作数时,结果是此类对象中的字节总数,包括内部填充和尾随填充。

(强调我的)