如果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个字节发生了什么,有助于区分不同的对象地址?
答案 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
的对齐要求。