在 C++ 中,计算一个类(class)的大小通常使用 sizeof 运算符。不过类的大小不仅仅是成员变量的简单相加,还会受到 内存对齐(padding / alignment)、虚函数 等因素影响。
下面详细讲解。
一、最基本方法:sizeof
#include <iostream>
using namespace std;
class A {
public:
int a;
char b;
};
int main() {
cout << sizeof(A) << endl;
}
输出可能是:
8
虽然:
int = 4
char = 1
理论大小:
4 + 1 = 5
但实际是 8,原因是 内存对齐。
二、类大小的计算规则
一般遵循 成员大小 + 内存对齐 + 特殊成员。
主要规则:
1 成员变量大小相加
class A {
int a; //4
double b;//8
};
理论:
4 + 8 = 12
但要考虑对齐。
2 内存对齐(Padding)
编译器会按照 最大成员的对齐要求 进行对齐。
例子:
class A {
char a; //1
int b; //4
};
内存布局:
a 1
padding 3
b 4
---------
total 8
所以:
sizeof(A) = 8
3 结构体/类整体对齐
类大小必须是 最大成员对齐数的整数倍。
例如:
class A {
char a; //1
int b; //4
char c; //1
};
布局:
a 1
pad 3
b 4
c 1
pad 3
---------
total 12
所以:
sizeof(A) = 12
三、空类大小
class A {};
结果:
sizeof(A) = 1
原因:
C++规定:
空类也必须占用至少 1 字节,以保证每个对象有唯一地址。
四、成员函数不占对象大小
class A {
public:
int a;
void func() {}
};
对象大小:
sizeof(A) = 4
原因:
函数存在 代码区,不在对象中。
五、静态成员变量不算在类大小里
class A {
public:
int a;
static int b;
};
对象大小:
sizeof(A) = 4
原因:
static 成员属于 类,不属于对象。
六、虚函数的影响
如果类有 虚函数,会增加 虚函数表指针 (vptr)。
例子:
class A {
public:
int a;
virtual void func() {}
};
内存:
vptr 8 (64位)
a 4
pad 4
-------
16
结果:
sizeof(A) = 16
(64位系统)
七、完整计算示例
class A {
char a; //1
int b; //4
double c; //8
};
计算:
a = 1
padding = 3
b = 4
c = 8
---------
total = 16
因为:
最大对齐 = 8
所以最终:
sizeof(A) = 16
八、总结口诀(面试常问)
计算 C++ 类大小步骤:
1 成员变量大小相加
2 按成员最大对齐补齐
3 类大小必须是最大对齐数的倍数
4 空类 = 1
5 成员函数不算
6 static成员不算
7 虚函数会增加vptr
如果你愿意,我可以再给你讲 C++面试最经典题:计算下面类的大小(100%面试会问),很多人第一次都会算错。