深入理解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 ...
随机推荐
- MySQL的 安装、配置、卸载
Mysql的安装配置(基于Centos7) 安装mysql数据库 [root@master ~]# wget https://dev.mysql.com/get/mysql57-community-r ...
- Git commit - Angular Convention
使用 Git 的开发者会使用 git commit 进行代码提交,也会使用 -m 提交commit message.对于一些个人开发者,也许他们会觉得"这是我个人的项目,不用太在意git c ...
- 更改 macOS 用户帐户和个人文件夹的名称
https://support.apple.com/zh-cn/HT201548 您可以对创建 macOS 用户帐户时命名的用户帐户和个人文件夹进行重命名. 您的 macOS 用户帐户名称和您个人 ...
- springboot的yml文件中如何配置redis?
springboot的yml文件中如何配置redis? 解决方法: spring: #redis配置 redis: database: 0 timeout: 0 # Redis服务器地址 host: ...
- 即时通讯技术文集(第45期):微信、QQ技术精华合集(Part2) [共14篇]
为了更好地分类阅读 52im.net 总计1000多篇精编文章,我将在每周三推送新的一期技术文集,本次是第45 期. [-1-] QQ音乐团队分享:Android中的图片压缩技术详解(上篇) [链接 ...
- 开源 Material Design WPF UI 控件库,易用且功能强大
前言 Material Design 是由 Google 开发的一套设计指南,提供统一的设计语言,使用户界面更加直观.美观和一致. Material Design In XAML Toolkit 是一 ...
- 修复展锐SL8541E 偶现开机无法启动OTG
哎,又是紫光展锐,真的拉啊!!! 问题是这样的,当USB口插上OTG线再开机,会偶现无法启动OTG.这个问题排查了好久,现在终于改好了,下面记录一下分析过程. 异常log[上]和正常log[下] 前面 ...
- Solution Set -「NOIP Simu.」20221003
\(\mathscr{A}\sim\) 二分图排列 定义一个数列 \(\{a_n\}\) 合法, 当且仅当无向图 \(G=(\{1..n\},\{(i,j)\mid i<j\land a_i ...
- Solution -「NEERC 2016」Delight for a Cat 的一个尝试
\(\mathscr{Description}\) Link. 给定 \(n,k,m_s,m_e\) 和两个长为 \(n\) 的序列 \(\{s\},\{e\}\), 选择一个 \(S\sub ...
- 【转载】Geojson常用工具,收藏备用
收集了网上几个比较好用的网站,收藏备用 1.Geojson数据下载器:http://datav.aliyun.com/tools/atlas/#&lat=33.54139466898275&a ...