深入理解C++ 空类大小
在C++中,规定空类(即类中没有任何数据成员、成员函数、虚函数等成员的类)的大小为1字节,这背后主要有以下几方面的原因:
保证对象的唯一性和可区分性
在C++的面向对象编程模型中,对象是类的实例化结果,每个对象在内存中都需要占据一定的空间,以便程序能够通过地址等方式对其进行操作和区分。即使一个类是空的,没有定义任何数据成员来占据实际的内存空间用于存储数据,但从语义上来说,它仍然需要有一个独一无二的实例存在于内存中。如果空类的大小被定义为0字节,那么当程序中创建多个该空类的对象时,由于它们都不占据实际内存空间,编译器在内存中就无法区分这些不同的对象,它们在内存中的表示会完全重合,这就违背了对象独立性和可区分性的原则。例如:
class EmptyClass {};
int main() {
EmptyClass obj1;
EmptyClass obj2;
// 如果空类大小为0,那么 &obj1 和 &obj2 将会相等,这是不合理的
std::cout << "obj1的地址: " << &obj1 << std::endl;
std::cout << "obj2的地址: " << &obj2 << std::endl;
return 0;
}
通过将空类的大小设定为1字节,每个对象在内存中都有了自己独立的、哪怕是最小限度的空间,编译器就能为它们分配不同的内存地址,从而保证了对象之间的可区分性,使得程序能够像对待其他正常有成员的类对象一样去操作它们。
满足数组元素地址连续的要求
在C++中,当定义一个类的数组时,数组中的元素在内存中是连续存放的。对于非空类,由于其有数据成员占据一定的空间,数组元素的内存布局自然能保证连续性。但对于空类来说,如果其大小为0字节,那么在定义数组时,就无法满足数组元素地址连续的特性了。例如:
class EmptyClass {};
int main() {
EmptyClass arr[5];
// 如果空类大小为0,数组元素的地址连续性就无法保证,不符合数组的内存布局要求
for (int i = 0; i < 5; ++i) {
std::cout << "arr[" << i << "]的地址: " << &arr[i] << std::endl;
}
return 0;
}
将空类大小设为1字节,就使得空类对象组成的数组也能像其他类型数组一样,保证元素在内存中的地址是依次连续的,符合C++中数组的内存布局规则,方便程序进行诸如通过指针遍历数组等操作。
与C++的对象模型和内存管理机制相适配
C++的编译器在处理类对象时,需要考虑对象的构造、析构、内存对齐等多方面的因素,即便类本身暂时没有数据成员。内存对齐方面,编译器通常会按照一定的规则(例如按照机器字长等)对数据进行对齐,以提高内存访问效率等。虽然空类没有实际的数据成员来体现这种对齐操作,但从整体对象模型的一致性角度来看,给空类分配1字节的大小,能更好地融入到这种内存管理和对齐的体系中。
而且在涉及到类的继承、多态等更复杂的面向对象特性时,空类作为一种基础的类定义形式,其大小设定为1字节也便于在后续扩展和构建更复杂的类层次结构时,能和其他有成员的类在内存布局、对象操作等方面保持协调统一,避免因为特殊的大小设定(比如0字节)而带来各种难以处理的兼容性问题和不符合常规编程预期的情况。
总之,C++规定空类大小为1字节是综合考虑了对象的基本语义、内存布局规则以及整个面向对象编程体系的一致性和可操作性等多方面因素的结果,有助于确保程序在各种情况下能正确、高效地处理类对象,哪怕是最简单的空类对象。
查看类对象内存
深入理解C++ 空类大小
cl test.cpp /d1reportSingleClassLayout + 类名
注意。上面指令是d1,1是数字1 , 不是字母l;
#include<list>
#include<IOStream>
#include<vector>
using namespace std;
class test
{
};
int main()
{
return 0;
}
深入理解C++ 空类大小
到此这篇关于C++ 空类大小的文章就介绍到这了
深入理解C++ 空类大小的更多相关文章
- C++空类大小
class a {};class b{};class c:public a{ virtual void fun()=0;};class d:public b,public c{}; 类a,b明明是空类 ...
- C++类大小
对于C++中类的大小,主要针对于无成员的空类大小,编译器会对该类进行优化,情况主要分为是否有虚表(虚函数)两种类型,对于无虚函数的类,该类大小均为1个字节(编译器插入一个char表示该类的存在),而出 ...
- sizeof 空类
C++标准规定类的大小不为0,空类的大小为1,当类不包含虚函数和非静态数据成员时,其对象大小也为1. 如果在类中声明了虚函数(不管是1个还是多个),那么在实例化对象时,编译器会自动在对象里安插一个指针 ...
- struct&&class 空的大小
#include using namespace std; class ClassA { }; class ClassB { private: int b; }; class ClassC : pub ...
- C++中的空类与空结构体大小
今天面试遇到了一个很有意思的问题,即空结构体在C++中所占的内存大小是多少?参见如下代码: #include <iostream> struct S0 { }; int main() { ...
- c++空类的大小
初学者在学习面向对象的程序设计语言时,或多或少的都些疑问,我们写的代码与最终生编译成的代码却大相径庭,我们并不知道编译器在后台做了什么工作.这些都是由于我们仅停留在语言层的原因,所谓语言层就是教会我们 ...
- C++空类以及没有成员变量的类的大小
关于C++中空类的大小为1,我们大家都有所了解,但是除了空类之外的其他一些没有成员变量的类的大小,还是有很多不明之处的. 我们来看如下一个例子: #include<iostream> us ...
- C/C++中的空类及抽象类大小
代码: #include <iostream> using namespace std; struct A{ }; struct B{ int i; }; class C:B{ ; }; ...
- 转:C/C++中,空数组、空类、类中空数组的解析及其作用
转自:http://blog.sina.com.cn/s/blog_93b45b0f01015s95.html 我们经常会遇到这些问题: (1)C++中定义一个空类,他们它的大小(sizeof) 为多 ...
- 深入理解计算机各种类型大小(sizeof)
深入理解计算机各种类型大小(sizeof) // Example of the sizeof keyword size_t i = sizeof( int ); struct align_dep ...
随机推荐
- simpleui
目录 一.simpleui 1.1 使用步骤 1.2 功能介绍 1.3 展示大屏 一.simpleui 之前公司里,做项目前后端结合,要使用权限,要快速搭建后台管理,使用djagno的admin直接搭 ...
- 解决docker 容器设置中文语言包出现的问题_docker
https://www.anquanclub.cn/5821.html 这篇文章主要介绍了解决docker 容器设置中文语言包出现的问题,具有很好的参考价值,希望对大家有所帮助.一起跟随小编过来看看吧 ...
- Qt编写地图综合应用21-路径规划
一.前言 近期重新将这个地图综合应用进行大幅度的改进更新升级,包括使用示例也做了非常多的改进和调整,其中就包括路径规划功能,之前只是调用了百度地图的JS交互接口,根据起始点坐标经纬度和结束点坐标经纬度 ...
- 零基础IM开发入门(三):什么是IM系统的可靠性?
本文编写时引用了"聊聊IM系统的即时性和可靠性"一文的部分内容和图片,感谢原作者. 1.引言 上一篇<零基础IM开发入门(二):什么是IM系统的实时性?>讲到了IM系统 ...
- 一款简单易用的印章设计工具 --(可转为ofd文件)
本人开发了一款印章设计软件:不但可以将印章保存为图片,而且可以保存为ofd格式文件. 将印章保存为ofd格式,有很多优势:占用资源少.缩放不失真.可添加元数据. 矢量化图形格式一般为svg.pdf.很 ...
- ClickHouse-4SQL参考
SQL参考 ClickHouse支持以下形式的查询: SELECT INSERT INTO CREATE ALTER 其他类型的查询 ClickHouse SQL 语句 语句表示可以使用 SQL 查询 ...
- Elasticsearch(4)--- 基本概念(Index、Type、Document、集群、节点、分片及副本、倒排索引)
这篇博客讲到基本概念包括: Index.Type.Document.集群,节点,分片及副本,倒排索引. 一.Index.Type.Document 1.Index index:索引是文档(Docume ...
- C 将十进制数转换成二~十六进制数中的任意一种
问题:将一个十进制整数转换成二~十六进制数中的任意一种进制数 代码: #include <stdio.h> #include <stdlib.h> int b; int i = ...
- bkce-6.0.4基础环境部署简述
1.概述 1.1.相关网站: # 蓝鲸软件包下载:https://bk.tencent.com/download/ # 蓝鲸社区版软件包下载https://bk.tencent.com/downloa ...
- Markers pg walkthrough Intermediate
发现是个md 变成pdf 的功能站 上网查exp 发现先了一个有用的 https://security.snyk.io/vuln/SNYK-JS-MARKDOWNPDF-5411358 能够任意文件读 ...