sizeof 对象

为什么 sizeof 空类 为 1?

在C++中,空类的 sizeof 永远至少为1字节,这是为了让每个对象在内存中有唯一地址.

class Empty {};

Empty没有数据成员;没有成员函数(只有编译期默认生成的);没有虚函数表.

sizoe(Empty)为1是C++的语言规范要求,为了支持核心语义:
每个对象必须有唯一地址.

Empty e1, e2;

如果sizeof(Empty)是0,那么e1e2可能拥有相同地址
(0字节不需要分配内存),这回破坏对象语义:

if (&e1 == &e2) {
  // 从地址来看两个对象是同一个对象,违反逻辑
}

这一个字节没有实际意义,不存放任何有效数据,仅仅是占位,保证对象在内存中有实体地址。

某些情况下这个占位会被编译期优化,例如空类作为基类(这在实际场景会出现吗?)

有些成员不在类内

类的虚函数、普通成员函数、静态成员变量、静态成员函数,都不占类对象的内存空间,因为它们不是存储在类对象里面的,而是存在于其他位置(函数段 / 数据段 / vtable等).

成员类型 是否在对象中
成员函数 不在对象中,代码段中,所有对象共用
静态成员变量 不在对象中,类级别变量,所有对象共用
虚函数 不在对象中,存在于vtable中
vptr 在对象中,指向vtable
posted @ 2025-04-07 10:07  代码改变头发  阅读(27)  评论(0)    收藏  举报