为什么sizeof为空类1?

时间:2019-07-08 02:59:18

标签: c++

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

Dim x As Long
Dim y As Long
Dim i as Integer

    y = Cells(1, Columns.Count).End(xlToLeft).Column
    x = Cells(Rows.Count, 3).End(xlUp).Row

For i = y To 3 Step -1

    If WorksheetFunction.Sum(Range(Cells(2, i), Cells(x, i))) = 0 Then
        Columns(i).EntireColumn.Delete
    End If

Next

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

2 个答案:

答案 0 :(得分:1)

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

对于您的class A,有一个数据成员(int a;),因此此特殊情况不适用。什么都没有添加。

仅需要特殊情况,因为否则编译器可以在同一内存位置放置多个零大小的对象。但是,如果类具有数据成员,则其大小不能为零,因此不会发生任何特殊情况。

答案 1 :(得分:1)

  

为什么sizeof为空类1?

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

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

  

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

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

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

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

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