网络宝典
第二套高阶模板 · 更大气的阅读体验

类大小的计算方式详解 日常维护方法与实用案例

发布时间:2025-12-16 22:39:40 阅读:90 次

大小是怎么算出来的

在学习C++这类面向对象语言时,很多人会遇到一个问题:一个类到底占多大内存?看起来只是几个变量拼在一起,但实际大小往往和想象中不一样。比如你定义了一个包含两个int成员的类,直觉上应该是8字节(每个int 4字节),结果用sizeof一测,发现确实是8字节。可一旦加入一个char,再加一个int,结果可能就不是9字节了。

这是因为编译器在布局类成员时,会进行内存对齐,以提高访问效率。不同的数据类型有各自的对齐要求,比如int通常要按4字节对齐,double是8字节。为了满足这个要求,编译器会在成员之间插入填充字节。

举个例子更清楚

看看下面这个类:

class Example {
char a;
int b;
char c;
};

这个类有三个成员:a是1字节,b是4字节,c是1字节。如果按顺序紧挨着放,理论上只需要6字节。但实际上,在大多数平台上,sizeof(Example)会是12字节。为什么?

因为int b需要4字节对齐。第一个char a占第0位,接下来的3个字节(1~3)会被填充,让b从第4位开始。b占4~7位,然后c放在第8位。但类的整体大小也要对齐到最大成员的倍数,也就是4字节对齐。所以最后会补3个字节,凑成12字节。

换个顺序试试

如果把成员重新排列:

class Optimized {
char a;
char c;
int b;
};

这时候总大小就变成了8字节。因为两个char可以连着放,共2字节,后面补2字节填充,让int b对齐到第4位。虽然还是有填充,但比之前少了4个字节。这说明成员顺序会影响类的大小。

空类也不为零

即使一个类什么成员都没有:

class Empty {};

sizeof(Empty)也不是0,而是1。这是因为每个对象必须有唯一的地址,编译器会分配一个字节来保证这一点。当然,如果这个空类作为基类,还可能被“压缩”掉,这就是空基类优化(EBO)。

继承情况下的大小计算

当涉及继承时,子类的大小是父类部分加上自己新增成员的大小。比如:

class Base {
int x;
};

class Derived : public Base {
char y;
};

Base占4字节,Derived在此基础上加一个char。但由于对齐,最终大小可能是8字节——父类4字节,子类成员1字节,后面补3字节。

了解类大小的计算方式,不仅能帮你写出更省内存的代码,还能在调试内存布局、结构体序列化等场景下少走弯路。下次写类的时候,不妨想想成员怎么排更划算。