【问题标题】:Why is sizeof empty class 1? [duplicate]为什么 sizeof 为空类 1? [复制]
【发布时间】:2019-07-08 02:59:18
【问题描述】:

如果空类的 sizeof 是 1 个字节,那么为什么 sizeof 类的 int 数据成员不是 5 个字节?

class A
{
    int a;
};

class B
{
};    

int main()
{
  std::cout << sizeof(A)<< ":" << sizeof(B) << "\n";
}

我知道预期的输出是 4 : 1 但只是想知道为什么 sizeof(A) 是 4 字节而不是 5 字节。有助于区分不同对象地址的 1 个字节会发生什么?

【问题讨论】:

标签: c++


【解决方案1】:

如果一个类没有数据成员,编译器会假装它包含一个 char 类型的不可见成员变量,它的大小为 1。

对于您的class A,有一个数据成员(int a;),因此这种特殊情况不适用。没有添加任何内容。

仅需要特殊情况,否则编译器可能会将多个零大小对象放置在同一内存位置。但是如果一个类有数据成员,它的大小不能为零,所以没有什么特别的事情发生。

【讨论】:

    【解决方案2】:

    为什么 sizeof 是空类 1?

    这是因为每个对象都保证有一个唯一的地址(例外情况适用)。为了使 N 个对象的数组具有 N 个具有唯一地址的对象,它们必须相隔 1 个字节存储。根据定义,这个距离就是类的大小。 1 字节是任何类型的最小可能大小。

    类可以包含不属于任何子对象的填充。空类包含单个字节的填充。

    那么为什么具有 int 数据成员的类的 sizeof 不是 5 个字节?

    因为非空类不需要填充来保证对象地址的唯一性。特别是,具有单个 int 成员的类不需要任何填充。

    非空类可能出于另一个原因需要填充:对齐。例如一个类:

    class C {
        alignas(4) int i;
        char c;
    };
    

    为了满足成员 i 的对齐要求,将具有大小 8(3 个字节填充)。

    【讨论】:

      猜你喜欢
      • 2011-03-09
      • 1970-01-01
      • 2018-03-05
      • 1970-01-01
      • 1970-01-01
      • 2014-08-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多