MST
星途 面试题库

面试题:C++ 空类 sizeof 值与内存对齐

已知在 C++ 中,空类有非零的 sizeof 值。假设有如下代码:`class Base {}; class Derived : public Base {};`,请分析 `sizeof(Derived)` 的值可能是多少,以及在不同编译器下因内存对齐规则不同对其值的影响。若 `Derived` 中再添加一个 `char` 类型成员变量,`sizeof(Derived)` 又会如何变化,为什么?
27.5万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试
  1. sizeof(Derived) 没有成员变量时
    • 在C++中,空类也会有非零的 sizeof 值,通常为1字节。这是为了确保每个对象在内存中有唯一的地址。当 Derived 类从空类 Base 公有继承时,sizeof(Derived) 的值通常和 sizeof(Base) 相同,即1字节。
    • 不同编译器下内存对齐规则的影响
      • 大多数编译器会保证对象的地址是对齐的,一般按照特定的字节数(如4字节、8字节等)对齐。但对于空类及其派生类,由于没有实际成员,编译器为了满足对象唯一性,会至少分配1字节空间,所以在这种简单情况下,内存对齐规则通常不会改变 sizeof(Derived) 的值,仍然为1字节。
  2. Derived 中添加一个 char 类型成员变量时
    • char 类型本身占用1字节。此时 sizeof(Derived) 的值至少为1字节(char 成员的大小)加上 Base 类的大小(通常为1字节),所以 sizeof(Derived) 至少为2字节。
    • 内存对齐规则的影响
      • 假设对齐模数为1:在这种情况下,sizeof(Derived) 为2字节,因为不需要额外的填充,char 成员紧挨着 Base 类对象部分存储。
      • 假设对齐模数为2:由于 char 成员本身占用1字节,为了满足2字节对齐,编译器会在 char 成员后填充1字节,此时 sizeof(Derived) 为4字节(2字节的 Base 类部分 + 1字节的 char 成员 + 1字节填充)。
      • 假设对齐模数为4:同样为了满足4字节对齐,sizeof(Derived) 也为4字节(2字节的 Base 类部分 + 1字节的 char 成员 + 1字节填充)。因为整体需要以4字节对齐,即使 char 成员加上 Base 类部分不足4字节,也会填充到4字节。