📜  为什么在C++中空类的大小不为零?(1)

📅  最后修改于: 2023-12-03 15:06:16.906000             🧑  作者: Mango

为什么在C++中空类的大小不为零?

C++中,空类是指没有成员变量和成员函数的类。尽管空类没有任何成员变量或成员函数,但是其大小通常不为0,这是为什么呢?

对象大小

要理解空类大小的概念,需要先了解对象大小的计算方法。在C++中,一个对象的大小是其成员变量大小之和,加上任意必需的填充字节,以保证其对齐方式。

考虑以下示例代码:

class Empty
{
};

int main()
{
    Empty empty;
    cout << sizeof(empty) << endl;
    return 0;
}

上面代码中,Empty类是一个空类,即没有成员变量和成员函数。在main函数中,我们创建了一个Empty对象,并使用sizeof运算符计算了其大小。而输出的结果是1。

这里的1是由于空类实例必须有一个独特的地址。即使一个空类对象没有任何成员,也要占用至少1个字节的内存空间。如果一个空类实例的大小为0,则操作系统为其分配的内存大小也是0,但分配的内存不能为0,因为每个对象在内存中都必须占用至少一个字节。

对齐规则

除了对象的大小计算外,还需要考虑对齐规则。对齐规则是指为了提高计算机性能而设计的一种内存分配方法。如果一个数据类型在内存中比它的大小更快地存储,则称为对齐方式。

在C++中,对齐方式由编译器决定,而通常根据特定的机器架构和操作系统来选择对齐规则。大多数系统要求每个数据类型的地址都是某个特定量的倍数(例如4或8),这些量称为对齐系数。对于大多数平台,类的对齐方式通常是最大成员变量的对齐系数。

对于空类,它不需要对齐,但是由于程序只能从空类的对象地址访问下一个对象,因此空类为了保持与其他类一样的对齐方式,需要对齐。对于大多数平台,空类的对齐方式通常为1。

总结

在C++中,空类通常不为0字节,因为空类需要至少占据1个字节的内存空间,以保证它有一个独特的地址。另外,由于空类需要与其他类保持一致的对齐方式,因此在大多数平台上,空类的对齐方式为1。

参考资料: