sizeof是编译期运算符,返回类型实际内存占用(含填充),受对齐、虚函数(添加vptr)、继承(虚继承引入vbptr)等影响;空类大小为1以保证对象地址唯一性。

sizeof 运算符能直接得到对象大小,但结果受对齐、继承和虚函数影响
sizeof 是唯一标准、编译期确定的方式。它返回的是该类型在内存中实际占用的字节数(含填充),不是成员变量大小之和。比如 struct { char a; int b; } 通常为 8 字节而非 5 字节——因为 int 要求 4 字节对齐,编译器在 a 后插入 3 字节填充。
空类为什么 sizeof 是 1 而不是 0
空类(如 struct Empty {};)的 sizeof(Empty) 必须大于 0,否则两个同类型对象可能被分配到同一地址,违反对象唯一性。C++ 标准强制规定至少为 1。这跟“占位符”作用有关,不是 bug,是语言设计必然结果。
有虚函数的类大小会包含虚表指针
只要类声明了虚函数(哪怕一个),编译器就会为其实例添加一个隐式的虚表指针(vptr)。在 64 位系统上通常是 8 字节,32 位是 4 字节。例如:
struct Base { virtual ~Base() = default; };
其 sizeof(Base) 在 x64 下为 8,即使没有数据成员。若再加一个 int x;,常见结果仍是 8(x 和 vptr 共享同一块对齐空间),但加两个 int 就变成 16(因要满足 8 字节对齐)。
多重继承和虚继承会让 sizeof 变得更难预测
普通多重继承只是把各基类布局拼接,但虚继承会引入额外的偏移指针(vbptr),进一步增加大小。例如:
struct A { int a; };<br><pre class="brush:php;toolbar:false;">struct B : virtual A { int b; };
在多数编译器下,sizeof(B)
真正需要精确控制布局时,用 #pragma pack 或 alignas 可以干预对齐,但会破坏 ABI 兼容性;调试时用 offsetof 查字段偏移比猜 sizeof 更可靠。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











