C++空类大小为什么不是0?

目录

C++空类大小是多少?

为什么C++空类大小不是0?

验证C语言空结构体的大小


C++空类大小是多少?

#include <iostream>
using namespace std;

class A{};
struct B{};

int main() {
	cout << sizeof(A) << endl;//在vs2019中 sizeof(A)的值是1
	cout << sizeof(B) << endl;//在vs2019中 sizeof(B)的值也是1
}

        提到空类的大小,很多人会觉得既然是空类,说明类中没有任何元素,所以空类的大小应该是0。我们可以用如上一段C++代码来计算一下在C++中空类的大小,这段代码的运行环境是win10系统下的VS2019。在VS2019的环境下,上述代码中的空类的大小是1,而不是0。同理,在C++中,结构体也可以当作类来使用,也可以说结构体是一种特殊的类,所以在C++中空结构体的大小也是1。

为什么C++空类大小不是0?

        我们来做一个假设,假设空类大小是0。将空类A实例化出两个对象a1,a2。a1,a2将会加载到main函数栈帧中。首先加载a1到0x11处,然后加载a2,因为假设a1大小是0,那么a2也会加载到0x11处,那这样两个对象加载到同一个空间,不就成了同一个对象了吗?所以C++中空类的大小不可能是0。

        通过这个过程我们也可以看出来,之所以将空类的大小设置为1,就是因为C++中需要对类进行实例化,所以需要将空类大小设置为1,避免出现下图这样的情况。而C++中的结构体又是一种特殊的类,同样也可以进行实例化来创建对象,所以C++中的空结构体的大小也是1。

验证C语言空结构体的大小

        在验证了C++中空类和空结构体的大小是1后,我还想验证一下C语言中空结构体的大小是多少,同样也是在win10系统下的vs2019中验证C语言的空结构体大小,代码如下。

#include <stdio.h>

struct A{}; //本行报错信息 E0169 应输入声明
struct B { int m; };

int main() {
	printf("空结构体A的大小:%d", sizeof(struct A)); //空结构体声明失败,无法打印大小
	printf("非空结构体B的大小:%d", sizeof(struct B)); //结构体B的大小是4
}

        想象中C语言的结构体既然不能实例化来创建对象,那么空结构体的大小就应该是0,但实际在win10系统下的VS2019中编译时,空结构体A却发生了报错,报错信息是“E0169 应输入声明”。看来与想象中的并不一致。之后我又在win10系统下的DEV-C++中输入上述代码,正确输出了空结构体A大小为0,非空结构体B的大小为4。DEV-C++运行截图如下:

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值