C++ 类大小计算详解
在 C++ 中,计算一个类的大小并不是简单地将成员变量的大小相加,而是涉及内存对齐、虚函数、继承等多个因素的影响。理解这些机制对于内存优化和底层调试至关重要。
核心规则速览
- 非静态成员变量是决定大小的主体。
- 静态成员变量存在于全局数据区,不属于类实例,
sizeof时不计入。 - 成员函数存储在代码段,不占用对象空间,不计入
sizeof。 - 虚函数:只要类中有虚函数(包括继承来的),实例中就会包含一个虚函数表指针(vptr)。64 位系统通常占 8 字节,32 位下占 4 字节。
- 内存对齐:编译器为了提高访问效率,会在成员间或末尾填充字节,使变量存储在其倍数地址上,且类总大小必须是最大对齐数的整数倍。
- 空类:大小为 1 字节,用于保证每个对象都有独一无二的地址。
实战案例解析
1. 基础情况:空类
class Empty {
// 没有任何成员
};
- 结果:1 字节
- 原因:即使没有成员,编译器也需要为对象分配一个唯一的地址,因此隐式插入 1 个字节。
2. 只有成员变量(考虑内存对齐)
class Example1 {
char c; // 1 字节
int i; // 4 字节
};
- 分析:
c从偏移 0 开始,占 1 字节。i需要 4 字节对齐,所以必须从偏移 4 开始存放。这意味着c后面会有 3 个字节的填充。- 当前已占:1 (
c) + 3 (填充) + 4 (i) = 8 字节。 - 最大对齐数是 4,8 是 4 的倍数,无需末尾填充。
- 结果:8 字节(直觉上的 1+4=5 是错误的)。
3. 引入虚函数(虚表指针)
class Base {
int a;
virtual void func() {}
};


