深入理解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 ...
随机推荐
- 解锁 Git Log 更多实用技巧
目前,在软件开发的协作中,Git 无疑是版本控制的王者. 而其中的 git log 命令,犹如一把强大的历史探寻之剑,能够帮助我们深入洞察项目的演进历程. 本篇将为大家整理解读几个实用的 git Lo ...
- 【Java】关于Maven仓库地址
仓库 如果你没有配置阿里云仓库镜像源,可以到这里来找 https://mvnrepository.com/ 如果你配置了阿里云仓库镜像源,可以来这里找 https://developer.aliyun ...
- Nginx https证书生成
一.证书和私钥的生成 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 1.创建服务器证书密钥文件 server.key: ...
- 冒泡排序------python实现
if __name__ == '__main__': ''' 算法描述 1.比较相邻的元素,更具大小交互位置 2.对每一对相邻元素作同样的工作,从开始第一队到结尾的最后一对,即可选出最大的数 3.所有 ...
- Qt/C++地图动态绘制折线多边形矩形圆形标注点/可编辑拖动调整大小和位置
一.前言说明 无论哪一家的地图,都提供了调用函数绘制各种覆盖物,但是有时候的场景是希望进入添加覆盖物模式,然后每次在地图上按下都自动生成对应的覆盖物比如圆形,这样就不需要用户提前知道经纬度坐标等参数, ...
- Qt/C++音视频开发56-udp推流和拉流/组播和单播推流
一.前言 之前已经实现了rtsp/rtmp推流,rtsp/rtmp/hls/flv/ws-flv/webrtc等拉流,这种一般都需要依赖一个独立的流媒体服务程序,有没有一种更便捷的方式不需要这种依赖, ...
- JavaWeb代码架构中类之间的引用关系
为了加深对Java Web代码架构中类之间的引用关系的理解和记忆,特绘制了这一张图. Java EE应用架构:
- 开源轻量级IM框架MobileIMSDK的鸿蒙NEXT客户端库已发布
一.基本介绍 MobileIMSDK-鸿蒙端是一套基于鸿蒙Next(纯血鸿蒙)系统的IM即时通讯客户端库: 1)超轻量级(编译后库文件仅50KB).无任何第3方库依赖(开箱即用): 2)纯ArkTS编 ...
- 即时通讯技术文集(第42期):直播技术合集(Part2) [共13篇]
为了更好地分类阅读 52im.net 总计1000多篇精编文章,我将在每周三推送新的一期技术文集,本次是第42 期. [-1-] 实时音频的混音在视频直播中的技术原理和实践总结 [链接] http:/ ...
- 使用Emgu.CV开发视频播放器简述
OpenCV是大名鼎鼎的视觉处理库,其对应的c#版本为Emgu.CV.本人采用Emgu.CV开发了一款视频播放软件,可对本地视频文件和rstp在线视频流播放,还具有对视频局部区域放大功能.虽然功能比较 ...