MST

星途 面试题库

面试题:C++ 空类 sizeof 值非零相关概念

在 C++ 中,空类的 sizeof 值通常不为零,请解释主要原因。并且假设存在一个空类 `class Empty {};`,若在不同编译器下其 sizeof 值不同,可能是哪些编译器实现细节导致的?
11.3万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

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