C/C++—— C++中一个空对象为什么还要占用一个字节空间

时间:2022-08-04 20:03:35

C++中一个空对象为什么还要占用一个字节空间?

先看一个实例输出结果:

#include <iostream>
using namespace std;

//一个空类
class Empty{


};

int main()
{
Empty e;
cout << "sizeof(e) = " << sizeof(e) << endl;

return 0;
}

输出结果为:sizeof(e) = 1
从输出结果可以看出一个空的对象占有的内存空间大小为1个字节。
但是经过测试一个空的string对象占有的内存空间大小为8个字节。

分析原因:

1.标准对此的确有规定,但没有明确规定空对象一定要是1字节,标准只是规定了对象的大小必须大于0,首先标准中有如下标定“An object is a region of storage. ”。
2.显然不存在0字节长度的存储区域,这句话隐含了空对象是大于0的,另外还有标定“a most derived object shall have a non-zero size and shall occupy one or more bytes of storage. Base class sub-objects may have zero size. An object of POD contiguous bytes of storage.”,
说明了最终派生对象大小是非0值,其大小可以是1或多个字节,基类子对象可以为0(任何可直接创建的对象都不会为0,如果一个类A是个空类,那么直接创建对象的时候大小为1,如果B类从A类派生并且没有额外的数据成员,那么直接创建B类时大小依然为1,规定对基类子对象可为0的规定使的编译器会进行空基类优化)。
3.最后在关于sizeof操作符中也有相关规定“The size of a most derived class shall be greater than zero ”,可见规定的确规定了空对象大小不能为0的现实,但却不强制其大小一定为1(这为编译器为不同的操作系统进行优化留有余地,比如说在不同字长[8,16,32,64]位CPU下,最有效率的操作数类型都是CPU的字长,那么编译器可以选择机器字长来作为不为0时的最小长度)。

下面是在知乎上该问题的回答:
C++ 中空类对象为什么占一个字节?

回答1:
因为空class的sizeof就是1。
class的sizeof不能为0,因为需要能允许把 class 实例放到数组里。如果sizeof是0,那么数组的sizeof呢,也是0?那么数组里有多少个元素呢?0/0?无穷多或N/A个?
这就没法玩了。所以空class的sizeof必须是1,这样还节省内存呢.

回答2:
因为如果是4或8字节的话,又会有人问为什么不是1字节,多浪费空间啊。
还有更狠的问法:居然sizeof(class A{}) > sizeof(class B{char c;}),设计者脑抽了吧!