C++ 如何计算类的大小

这是一个非常经典的 C++ 面试题。在 C++ 中,计算一个类的大小并不是简单地将成员变量的大小相加,而是涉及内存对齐、虚函数、继承等多个因素的影响。
以下是计算类大小的核心规则和详细步骤:
核心结论速览
- 非静态成员变量是影响大小的主体。
- 静态成员变量不属于类实例,存在全局数据区,不计入
sizeof。 - 成员函数存在代码段,不计入
sizeof。 - 虚函数:只要类有虚函数(无论是 1 个还是多个),类实例中就会有一个虚函数表指针(vptr),在 64 位系统下通常占8 字节,32 位下占4 字节。
- 内存对齐:编译器为了提高访问效率,会在成员之间或末尾填充字节,使变量存储在其倍数地址上,并使类总大小是最大对齐数的整数倍。
- 继承:
- 空类大小为 1 字节(为了占位,表示对象存在)。
- 派生类的大小一般是基类成员 + 派生类新成员,同时也要满足对齐规则。
详细计算步骤与示例
1. 基础计算:空类
class Empty {
// 没有任何成员
};
- 大小:1 字节
- 原因:编译器需要给这个类的对象分配一个独一无二的地址,所以会隐式插入 1 个字节。
2. 只有成员变量(考虑内存对齐)
对齐规则:
- 第一个成员在偏移量为 0 的位置。
- 后续成员要放到该成员大小的整数倍上。
- 最终类的大小要是最大成员大小的整数倍。
class Example1 {
char c; // 1 字节
int i; // 4 字节
};
- 分析:
c占偏移 0。i占 4 字节,需要从 4 的倍数(偏移 4)开始存。因此,在c后面会有 3 个字节的。


