sizeof 对象
为什么 sizeof 空类 为 1?
在C++中,空类的 sizeof 永远至少为1字节,这是为了让每个对象在内存中有唯一地址.
class Empty {};
Empty没有数据成员;没有成员函数(只有编译期默认生成的);没有虚函数表.
sizoe(Empty)为1是C++的语言规范要求,为了支持核心语义:
每个对象必须有唯一地址.
Empty e1, e2;
如果sizeof(Empty)是0,那么e1和e2可能拥有相同地址
(0字节不需要分配内存),这回破坏对象语义:
if (&e1 == &e2) {
// 从地址来看两个对象是同一个对象,违反逻辑
}
这一个字节没有实际意义,不存放任何有效数据,仅仅是占位,保证对象在内存中有实体地址。
某些情况下这个占位会被编译期优化,例如空类作为基类(这在实际场景会出现吗?)
有些成员不在类内
类的虚函数、普通成员函数、静态成员变量、静态成员函数,都不占类对象的内存空间,因为它们不是存储在类对象里面的,而是存在于其他位置(函数段 / 数据段 / vtable等).
| 成员类型 | 是否在对象中 |
|---|---|
| 成员函数 | 不在对象中,代码段中,所有对象共用 |
| 静态成员变量 | 不在对象中,类级别变量,所有对象共用 |
| 虚函数 | 不在对象中,存在于vtable中 |
| vptr | 在对象中,指向vtable |

浙公网安备 33010602011771号