面试题答案
一键面试- 空类
sizeof
值通常不为零的主要原因:- C++ 标准规定,不同对象必须有不同的地址。如果空类的
sizeof
为零,那么当创建多个空类对象时,这些对象在内存中可能会有相同的地址,这违反了上述规定。所以,编译器通常会为每个空类对象分配一个最小的非零空间,一般为 1 字节,以确保不同对象有不同的内存地址。
- C++ 标准规定,不同对象必须有不同的地址。如果空类的
- 不同编译器下
sizeof
值不同的可能实现细节:- 字节对齐:
- 不同编译器对于字节对齐的策略不同。例如,有些编译器可能按照默认的对齐规则(如 4 字节对齐或 8 字节对齐)对对象进行内存布局。即使空类本身没有成员变量,为了满足字节对齐的要求,编译器可能会在空类对象后填充一些字节,导致
sizeof
值不同。比如在 4 字节对齐的编译器下,空类对象大小可能被调整为 4 字节;在 8 字节对齐的编译器下,可能被调整为 8 字节。
- 不同编译器对于字节对齐的策略不同。例如,有些编译器可能按照默认的对齐规则(如 4 字节对齐或 8 字节对齐)对对象进行内存布局。即使空类本身没有成员变量,为了满足字节对齐的要求,编译器可能会在空类对象后填充一些字节,导致
- 额外信息存储:
- 一些编译器可能会为对象存储额外的元数据,例如用于运行时类型识别(RTTI)的信息。如果编译器为空类对象也存储这类信息,那么
sizeof
值会因所存储元数据的大小不同而有所差异。比如某些编译器可能会为空类对象分配额外的指针大小的空间(如 4 字节或 8 字节,取决于系统是 32 位还是 64 位)来存储 RTTI 相关信息,从而使空类的sizeof
值增大。
- 一些编译器可能会为对象存储额外的元数据,例如用于运行时类型识别(RTTI)的信息。如果编译器为空类对象也存储这类信息,那么
- 字节对齐: