目录
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++运行截图如下:
|