C++ 面试宝典之:空类大小究竟是不是 0?

以下内容为本人的学习笔记,如需要转载,请声明原文链接 微信公众号「ENG八戒」https://mp.weixin.qq.com/s/pD4bIjX2kDzo8gbYRPktPQ

首先,空类是什么?空类指的是不包含任何数据成员的类,但可能包含方法成员。

实例化时,对象需要分配存储空间用于存放数据成员,数据成员的大小和数量决定了对象的大小。如果一个类不包含任何的数据成员,那么实例化的时候应该不需要这些多余的空间。

但是实例化对象的存储空间唯一代表该对象,相应的空间地址也应该是唯一的。如果类实例化时没有分配空间,空间地址也无法确定,那么这个对象如何被识别和访问?

同一个类可以被多次实例化,也就是创建多个对象,每次实例化的对象应该是不同的,那么对应的存储空间位置也是不同的。如果地址重复说明该对象应该是同一个。

为了区分对象是否是同一个,一般通过地址来比较。下面来看看定义一个空类,分别创建两个实例对象,测试对比地址是否一致:

class test { };

int main()
{
  test a, b;
  if (&a == &b)
    std::cout << "impossible: report error to compiler supplier" << std::endl;

  test* p1 = new test;
  test* p2 = new test;
  if (p1 == p2)
    std::cout << "impossible: report error to compiler supplier" << std::endl;

  return 0;
}

如果空类对象的大小为 0,那么分配的存储空间就会重叠,地址也会一样。但是上面的例程编译后实际运行结果没有输出任何信息,可见同一个空类的不同实例的地址不同,也就是说这个时候的空类的对象也会占用空间,为什么呢?

因为编译器需要区分空类的实例,所以强制给它分配了冗余的空间,这样创建空类实例返回的地址才会不一样,而且类实例化可以保留的最小内存量是 1 个字节。所以,直接实例化空类,对象大小为 0。

派生后优化

同时,如果用空类去派生新类,并且派生类存在数据成员时,派生类实例化的对象大小会受到基类的冗余空间影响吗?

class derive : public test {
  int a;
  // ...
};

int main()
{
  derive p;
  void* p1 = &p;
  void* p2 = &p.a;
  if (p1 == p2)
    std::cout << "nice: good optimizer";

  return 0;
}

编译执行上面的程序

nice: good optimizer

从输出信息来看,p.a 的地址和 p 的地址一样,可见空类 test 的派生类 derive 实例化后对象大小没有了基类对象原有的冗余空间,也就是空类这个时候真的不再占用空间。这要归功于编译器的优化处理,由于派生类存在数据成员,所以派生类实例化的对象大小会被优化,不再为基类分配冗余空间。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/783279.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

苹果电脑压缩软件哪个好用一些? mac电脑用什么压缩软件 mac电脑压缩文件怎么设置密码

压缩软件是Mac电脑必不可少的工具&#xff0c;虽然Mac系统自带了一款“归档实用工具”&#xff0c;但是其功能实在匮乏&#xff0c;若你需要加密压缩文件或者把文件压缩成指定格式&#xff0c;那么该工具无法满足你的需求。Mac用户应该怎么选择压缩软件呢&#xff1f;本文就来告…

git 文件没有修改,但一直提示有0行改动,还原也不行

查看文件修改内容 原来是文件的模式(读写可执行权限)发生了变化,内容本是没有变化. 怎么解决 git config --add core.filemode false忽略文件模式

java中反射(Reflection)的4个作用

java中反射&#xff08;Reflection&#xff09;的4个作用 作用1、在运行时判断任意一个对象所属的类作用2、在运行时构造任意一个类的对象作用3、在运行时判断任意一个类所具有的成员变量和方法作用4、在运行时调用任意一个对象的方法总结 &#x1f496;The Begin&#x1f496;…

Excel 宏录制与VBA编程 ——VBA编程技巧篇二 (合并内容相同连续单元格、取消合并单元格并在每个单元格中保留内容)

1、合并内容相同的连续单元格 如果需要合并如图所示的工作表中B列中部门相同的连续单元格 VBA代码&#xff1a; Sub Mergerng()Dim IntRow As IntegerDim i As IntegerApplication.DisplayAlerts FalseWith Sheet1IntRow .Range("A65536").End(xlUp).RowFor i In…

移动UI: 什么特征会被认为是简洁风格,用案例告诉你

什么是简洁风格&#xff0c;恐怕一百个人有一百个是理解&#xff0c;本文通过理论分析案例的方式进行探讨。 移动 UI 中的简洁风格通常具有以下几个特征&#xff1a; 1. 平面化设计&#xff1a; 简洁风格的移动 UI 善于运用平面化设计&#xff0c;即去除过多的阴影、渐变和立…

电子教室如何防止关闭客户端?

防止电子教室中的客户端被学生关闭或绕过&#xff0c;需要采取一系列技术和策略性的措施。以下是一些可行的方法&#xff1a; 技术手段 1. 使用专用教学软件&#xff1a; 采用具有强大控制功能的电子教室软件&#xff0c;如极域电子教室&#xff0c;它们通常包含防关闭、防退…

从工具到平台:AI PC 的崛起

从工具到平台&#xff1a;AI PC 的崛起 AI技术正以前所未有的速度改变着我们的生活和工作方式。随着大模型技术从云端向终端设备下沉&#xff0c;个人电脑正成为AI部署的首选终端。AI PC的崛起不仅标志着个人电脑行业的一次重大变革&#xff0c;更预示着一个全新的个人AI时代的…

2024年文化研究与数字媒体国际会议 (CRDM 2024)

2024年文化研究与数字媒体国际会议 (CRDM 2024) 2024 International Conference on Cultural Research and Digital Media 【重要信息】 大会地点&#xff1a;珠海 大会官网&#xff1a;http://www.iccrdm.com 投稿邮箱&#xff1a;iccrdmsub-conf.com 【注意&#xff1a;稿将…

算法 —— 二分查找

目录 二分查找 在排序数组中查找元素的第一个和最后一个位置 搜索插入位置 x的平方根 山峰数组的峰顶索引 寻找峰值 搜索旋转排序数组中的最⼩值 点名 二分查找模板分为三种&#xff1a;1、朴素的二分模板 2、查找左边界的二分模板 3、查找右边界的二分模板&#xf…

3D问界—什么是blender,与MAYA有什么区别

问题提出&#xff1a;什么是blender&#xff0c;与MAYA有什么区别 Blender 是一个开源的、免费的 3D 建模和动画软件&#xff0c;广泛应用于各种领域。它提供了丰富的功能和工具&#xff0c;适用于从业余爱好者到专业艺术家的不同需求。 1. Blender 的主要用途和功能 属 性描述…

十一、作业

1.从大到小输出 写代码将三个整数数按从大到小输出。 void Swap(int* px, int* py) {int tmp *px;*px *py;*py tmp;} int main() {int a 0;int b 0;int c 0;scanf("%d %d %d", &a, &b, &c);int n 0;if (a<b){Swap(&a, &b);}if (a &l…

数据库课设---酒店管理系统(MySQL、VBNet)

目录 一. 知识技术 二. 需求分析 2.1 功能需求 2.2 数据需求 三. 数据流图与数据字典 3.1 数据流图 3.1.1 业务流图 3.1.2 数据流图 3.1.3 关系图 3.2 数据字典 四. 数据库设计 4.1 概念模型设计 4.2 逻辑模型设计 4.3 数据库实现 …

强化学习中的Double DQN、Dueling DQN和PER DQN算法详解及实战

1. 深度Q网络&#xff08;DQN&#xff09;回顾 DQN通过神经网络近似状态-动作值函数&#xff08;Q函数&#xff09;&#xff0c;在训练过程中使用经验回放&#xff08;Experience Replay&#xff09;和固定目标网络&#xff08;Fixed Target Network&#xff09;来稳定训练过程…

计算机组成原理学习笔记(一)

计算机组成原理 [类型:: [[计算机基础课程]] ] [来源:: [[B站]] ] [主讲人:: [[咸鱼学长]] ] [评价:: ] [知识点:: [[系统软件]] & [[应用软件]] ] [简单解释:: 管理计算机系统的软件&#xff1b; 按照任务需要编写的程序 ] [问题:: ] [知识点:: [[机器字长]] ] [简单…

盘点2024年6月Sui生态发展,了解Sui近期成长历程

随着区块链技术的迅猛发展&#xff0c;Sui生态在2024年6月取得了令人欣喜的进步。作为创新的L1协议&#xff0c;Sui不仅在技术革新方面表现突出&#xff0c;还在DeFi、游戏应用和开发者工具等领域展现出强大的潜力。本篇文章将全面盘点Sui在过去一个月内的生态发展&#xff0c;…

【融合ChatGPT等AI模型】Python-GEE遥感云大数据分析、管理与可视化及多领域案例实践应用

随着航空、航天、近地空间遥感平台的持续发展&#xff0c;遥感技术近年来取得显著进步。遥感数据的空间、时间、光谱分辨率及数据量均大幅提升&#xff0c;呈现出大数据特征。这为相关研究带来了新机遇&#xff0c;但同时也带来巨大挑战。传统的工作站和服务器已无法满足大区域…

JavaSE第10篇:常用类

文章目录 一、Object1、Object使用2、toString3、equals和4、hashCode5、clone6、finalize7、getClass8、wait、notify和notifyAll 二、使用步骤 一、Object 1、Object使用 Object类是所有Java的根父类 如果在类的声明中未使用extends关键字指明其父类&#xff0c;则默认父类…

如何监控和优化 PostgreSQL 中的连接池使用?

文章目录 一、连接池的基本概念二、监控 PostgreSQL 连接池使用的重要性&#xff08;一&#xff09;性能优化&#xff08;二&#xff09;资源管理&#xff08;三&#xff09;故障排查 三、PostgreSQL 连接池监控指标&#xff08;一&#xff09;活跃连接数&#xff08;二&#x…

数据结构练习

1. 快速排序的非递归是通过栈来实现的&#xff0c;则前序与层次可以通过控制入栈的顺序来实现&#xff0c;因为递归是会一直开辟栈区空间&#xff0c;所以非递归的实现只需要一个栈的大小&#xff0c;而这个大小是小于递归所要的&#xff0c; 非递归与递归的时间复杂度是一样的…

springboot解压文件流zip压缩包

springboot解压文件流zip压缩包 原始文件存储的地方&#xff1a; 需要在当前目录下解压该文件&#xff0c;如下图&#xff1a; 代码示例&#xff1a; private Result<String> getLocationGuideLayerName(YbYstbtqTaskResolveParam params, String fishnetLayerName)…