匿名对象以及临时空间

news2024/11/27 6:48:44

目录

大纲

1.何为匿名对象

2.产生匿名对象的四种情况:

1)给初始化对象时

2)以值的方式给函数传参;

3)类型转换;

4)函数返回时;

3.编译器优化

I.在同一行代码的优化

II.在函数调用和返回时。

4.匿名使用场景以及注意事项;


大纲

1.何为匿名对象

2.产生匿名对象的四种情况:                                                                   

3.编译器优化

4.匿名使用场景以及注意事项;

5.匿名对象生命周期的延迟;

以下是测试代码:

class ClTest
{
public:
	ClTest()
		:_flag('K')
	{
		printf("%c:默认构造函数调用:this:%p\n",_flag,this);
	}
	ClTest(const char& tmp)
		:_flag(tmp)
	{
		printf("%c:传参构造函数调用:this:%p\n", _flag, this);
	}
	~ClTest()
	{
		printf("%c:析构函数调用:this:%p\n", _flag, this);
	}
	ClTest(ClTest&e)
	{
		printf("%c:拷贝构造函数调用:this:%p\n", _flag, this);
	}
	ClTest& operator =(const ClTest&)
	{
		printf("%c:赋值运算符重载调用:this:%p\n", _flag, this);
	}
private:
	char _flag;
};

1.何为匿名对象

匿名对象可以理解为是一个临时对象,一般系统自动生成的。这个对象没有名字,通常即用即销毁,在同一行内生成后销毁。

具名==显示

下面是通常即用即销毁演示:调试到41行

 按下F10调试到42行

发现我们构造的匿名对象立刻又销毁了。所以通常情况下,匿名函数都是即用即销毁的。

2.产生匿名对象的四种情况:

1)给初始化对象时

首先:先生成匿名对象,然后使用匿名对象数据拷贝构造copy对象。

2)以值的方式给函数传参;

        这里有个知识点匿名对象是具有常性的,所以在匿名对象传参构造函数时必须加const

这样是掉不动的需要形参加上const 

ps:其实内置类型也可以匿名传参(也是具有常性,但是内置类型通常传值传参足够了)

 我们不写形参名字是允许的,我们不使用形参也就不需要写形参名。

  这里还有个注意点函数调用传参允许创建匿名实参传参,但是不允许创建具名实参传参

 这样是不允许的。

  3)类型转换;

 其实他可以等价为

I、II、III的的工作其实是一样的,都是利用一个对象拷贝构造另一个对象,只是I和II利用匿名对象而III是创建具名对象,然后利用具名对象拷贝构造copy对象。

4)函数返回时;

1.返回类型为传值返回,拷贝构造接收。

 首先我们知道临时空间与匿名对象都是常性数据,但是传值接收到ret是被允许的

2.返回类型为传值返回,引用接收。

我们必须要加const

 注意!!!这里的返回值其实发生了野引用,引用了临时空间的数据,他是即用即销毁的,所以尽量不要这样引用

3.返回类型为引用返回,拷贝构造接收。

 注意!!!这里也发生了野引用的出现,当栈销毁时我们引用的des对象被销毁,而临时空间引用了des的数据。但是一般情况下,返回到构造完ret对象后该空间将不在使用了

但是最怕最怕出现ret为引用接收

4.返回类型为引用返回,引用接收。

ret将引用一个被销毁的空间,使用ret极大困难会导致程序崩溃!!!

怎么办呢?我们如果引用在栈中生成的数据?
一、static

 二、堆上数据


3.编译器优化

I.在同一行代码的优化

使用匿名对象时拷贝另一个具名对象

 原本这一行会发生=匿名构造+copy拷贝构造+匿名析构,编译器会优化为一次copy的构造;

编译器会将一行多次重复的动作,改变为只一次拷贝构造。

II.在函数调用和返回时。

调用时

发现原本时调用func会先发生构造匿名对象然后再拷贝构造到形参对象。 

优化后:变为一次拷贝构造

返回时。

第一行的不用管。

 这里的析构函数调用时形参的原因不用管。

我们看原本:des返回后先拷贝构造到临时空间(匿名对象)然后正在拷贝构造到copy中。

优化后:变为一次拷贝构造

在同行或函数调用传参时与函数返回的返回传值时,我们的编译器会对多次构造拷贝等等,优化为一次构造函数。


4.匿名使用场景以及注意事项;

第3点说明了同行或函数调用传参时与函数返回的返回传值,类多次实例化,编译器会优化为一次,那么如果不是同一行的构造,编译器会优化吗?

 这里我们先声明copy,然后通过运算符重载,看看编译器会不会优化处理

编译器未没有优化处理。发生:默认构造+传参构造+运算符重载+析构函数=为了一次copy的值

我们继续F10。 

原本这一行会发生=匿名构造+_copy拷贝构造+匿名析构,编译器会优化为一次_copy的构造;

发现仅仅只发生了一次传参构造,使用'C'传参构造_copy对象。

说明:copy对象与_copy对象的工作其实是一样的都是将字符‘c’传入到对象中,而copy的工作调用了4个函数,而_copy仅仅调用一次构造函数,就完成了工作,大大提升了效率。这是我们所追求的。

结论:当我们初始化时应该直接就赋值,这可大大提高程序效率。

5.匿名对象生命周期的延迟;

匿名数据难道只能即用即销毁吗?非也。

我们可以利用引用延迟他的死亡。由于匿名对象具有常性,引用类型必须加const。

 根据前面内容,F10后我们会创建匿名对象后立刻销毁。但是引用后会强行续命

在下一行后,不会调用析构函数回收匿名对象资源。

在函数结束后才会销毁创建的对象。

其实这里我们可以认为我们匿名对象变为了rt引用名,rt就是该空间唯一名字。


谢谢你的阅读谢谢!!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

电脑关机很慢怎么办?这5个方法很有用!

案例:电脑关机很慢怎么办? 【我的电脑才买来不久,现在每次关机都很慢,有时甚至一直在转圈圈无法关机,怎么处理这种情况呢?】 如果使用电脑时间长了,我们可能会发现电脑的各项性能都会有所下降…

Vue3(5)插槽Slots

目录 一、插槽内容与出口 二、渲染作用域 三、默认内容 四、具名插槽 五、作用域插槽 六、具名作用域插槽 一、插槽内容与出口 在之前的博文中,我们已经了解到组件能够接收任意类型的JS值作为props,但组件要如何接收模板内容呢?在某些…

图片堆叠、多重聚焦的几种办法

当拍摄的物品较小,景深较深时,相机的焦点只能放在较近或者较远的一处,图片的整个画面就不能保证完全清晰,多重聚焦的原理其实就是拼合,在画幅的不同处拍摄聚焦图片,将各个聚焦的内容拼合在一起,…

杂记 2023.5.11

目录 come across(as).. 与异性对话经验和理论、策略 单词记忆 机器学习 come across(as).. 这个用法在口语里超级高频,表示「给人.印象,让人觉得..」,s后面可跟名词、形容词、 being形容词。 我们再来看几个例子: ◆He comes ac…

【Leetcode -455.分发饼干 -459.重复的字符串】

Leetcode Leetcode -455.分发饼干Leetcode - 459.重复的字符串 Leetcode -455.分发饼干 假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。 对每个孩子 i,都有一个胃口值 g[i],这是能让孩…

多语言的APP外包开发流程

很多创业的人希望把APP做成多国家使用的模式,尤其是一些小游戏开发,很多小游戏玩法全世界都是一样的,这样开发一次就可以在全球推广。在开发这种类型软件的过程中需要注意哪些呢,今天和大家分享这方面的知识。北京木奇移动技术有限…

C语言入门篇——字符串,内存函数

目录 1、字符串函数 1.1求字符串长度 1.1.1strlen函数 1.2长度不受限制的字符串函数 1.2.1strcpy函数 1.2.2strcat函数 1.2.3strcmp函数 1.3长度受限制的字符串函数介绍 1.3.1strncpy函数 1.3.2strncat函数 1.3.3strncmp函数 1.4字符串查找 1.4.1strstr函数 1.4.…

JavaScript实现输入年龄来判断年龄阶段是青年/中年/老年人的代码

以下为实现输入年龄来判断年龄阶段是青年/中年/老年人的程序代码和运行截图 目录 前言 一、实现输入年龄来判断年龄阶段是青年/中年/老年人 1.1 运行流程及思想 1.2 代码段 1.3 JavaScript语句代码 1.4 运行截图 前言 1.若有选择,您可以在目录里进行快速查找…

open3d 裁剪点云

目录 1. crop_point_cloud 2. crop 3. crop_mesh 1. crop_point_cloud 关键函数 chair vol.crop_point_cloud(pcd) # vol: SelectionPolygonVolume import open3d as o3dif __name__ "__main__":# 1. read pcdprint("Load a ply point cloud, crop it…

哪些蓝牙耳机戴久不疼?长时间佩戴不疼的蓝牙耳机推荐

现在的真无线耳机已经成为了人们的标配之一了,各个厂家也紧随其后,生产出了多种无线耳机,不少人的选购蓝牙耳机一般都是对音质、佩戴和连接,但通常人们佩戴蓝牙耳机都是在半天左右,小编专门整理了一期舒适度高的耳机&a…

从 0~1 创建 Vue2 项目

前言 从0开始搭建Vue2项目;介绍项目目录结构;为了项目方便需要添加的配置。创建 Vue2 项目共有两种方式: 手动选择;选择默认模式。 给孩子点点关注吧!😭 一、环境准备 1.1 安装包管理工具 1.1.1 安装 …

使用CV-CUDA提高基于计算机视觉的任务吞吐量

使用CV-CUDA提高基于计算机视觉的任务吞吐量 涉及基于 AI 的计算机视觉的实时云规模应用程序正在迅速增长。 用例包括图像理解、内容创建、内容审核、映射、推荐系统和视频会议。 然而,由于对处理复杂性的需求增加,这些工作负载的计算成本也在增长。 从…

凌恩生物文献分享|南农大胡锋教授团队揭示苯并[a]芘胁迫影响蚯蚓肠道病毒组生态适应策略机制

蚯蚓被誉为“土壤生态系统工程师”,对于土壤结构改良、有机质分解、土壤污染修复具有重要意义,同时蚯蚓也被作为评估污染物生态风险的灵敏指示者。蚯蚓肠道微生物对于蚯蚓生态功能的发挥至关重要,为了充分利用蚯蚓的生态和生物技术效益&#…

Python每日一练:蚂蚁家族(详解集合法)

文章目录 前言一、题目二、代码分析总结 前言 这题挺有意思,感觉评简单难度有点低了,如果正经用无向图来做,代码还是有点长的。首先得建立节点,估计除第一个和最后一个每个节点都是一条线连进,一条线连出的。就可以这…

对接银行处理退票的解决方案

什么是退票? 在跨行支付时,付款请求提交汇出行后,由汇出行转交至人民银行支付系统,经人民银行大小额系统处理后会先返回交易成功的结果,再由人民银行转至收款行,收款行在清算过程中会将收款人账户信息、状…

MyBatis--XxxxMapper.xml-SQL 映射文件和MyBatis--动态SQL 语句-更复杂的查询业务需求

目录 MyBatis--XxxxMapper.xml-SQL 映射文件 XxxMapper.xml-基本介绍 MyBatis 的真正强大 2、SQL 映射文件 XxxMapper.xml-详细说明 因为这是一个宁外开了一个项目所以做一下前期准备 Monster.java MonsterMapper接口 MonsterMapper .xml MonsterMapperTest.java jdbc…

【sop】基于灵敏度分析的有源配电网智能软开关优化配置[升级1](Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

【AI大模型】教你用百度《文心一言》5分钟写一篇博客

文章目录 前言文心一言是什么文心一言可以做什么文心一言写博客申请体验写在最后 前言 当今社会,博客已成为了许多人分享观点、知识和经验的重要平台。用文心一言写博客是将自己的思考、想法和经验以文字的形式呈现出来,让更多人了解自己。通过写博客&a…

量化因子在 DolphinDB 中的流式实现攻略

DolphinDB 是一款高性能分布式时序数据库。与传统的关系数据库和常见的时序数据库不同,DolphinDB 不仅提供了高速存取时序数据的基本功能,而且内置了向量化的多范式编程语言与强大的计算引擎。DolphinDB 的计算引擎不仅可以用于量化金融的回测和研发&…

Aztec 征集 Rollup Sequencer去中心化提案

1. 引言 前序博客: Rollup去中心化Rollup Decentralization Aztec Rollup中Sequencer角色的主要职责为: 1)从mempool中选取pending交易2)将选中的pending交易排序打包到L2区块中3)验证所有private交易proof以检查其…