IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> C++空类大小为什么不是0? -> 正文阅读

[C++知识库]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++运行截图如下:

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-08-19 18:45:50  更:2022-08-19 18:49:36 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/13 1:57:34-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码