当前位置: 首页 > news >正文

【M19】了解临时对象的来源

1、首先,确认什么是临时对象。在swap方法中,建立一个对象temp,程序员往往把temp称为临时对象。实际上,temp是个局部对象。C++中所谓的临时对象是不可见的,产生一个non-heap对象,并且没有命名,便是一个临时对象。

2、临时对象的来源有:隐式类型转换,方法返回值,抛出异常的时候。

3、隐式类型转换:在初始化或者赋值的过程中,如果类型不匹配,需要一个适配的临时对象,编译器会构造这个临时对象,使调用成功。

  注意:这种适配,只能执行一次,不能执行多次。为什么?假如可以执行多次,从一个对象到另一个对象,存在很多转换路径,编译器不可能找出所有的路径。就算可以找出所有的路径,存在多条转换路径,到底走哪一条呢?

4、隐式类型转换产生的临时对象不可修改,也就是const。不能赋值给non-const引用。为什么?

  假设可以赋值给non-const引用,程序员修改这个引用,企图修改原数据,但实际上修改的是临时对象,这与程序员的期望不一致。因此,规定临时对象是const。

5、方法返回值是个临时对象,它没有名称,就是一个返回值。思考,为什么需要这个临时对象?

  方法内的局部对象在调用完成后,被销毁。因此,从这个局部对象到调用端,必须有一个临时对象,才能传递过去。

6、方法返回值往往是const对象,这个为了,禁止客户对方法返回值进行赋值。

7、抛出异常的时候,从抛出端到catch语句,必须有一个临时对象才能传递过去,需要注意的是,这个临时对象可以修改。

8、临时对象造成效率低,因为必须承担临时对象的构造和析构成本。因此,应该避免产生临时对象。

  对于隐式类型转换:两种方法,使隐式转换不再发生,或者隐式转换不再需要。

  对于方法返回值:使用一个技巧,返回值优化RVO(Return Value Optimization),让编译器进行优化。

  对于抛出异常的时候:从抛出异常到catch语句,这个临时对象必不可少,当然编译也可能进行优化。需要注意的是,catch语句中应该使用by reference,避免再一次的copy构造,同时避免对象切割。

相关文章:

  • NSTimer的详细用法
  • Windows下安装Scrapy方法及常见安装问题总结——Scrapy安装教程
  • c# Winform上传文件
  • Codeforces Round #532 (Div. 2)
  • Ubuntu 图形处理软件
  • 【每日笔记】【Go学习笔记】2019-01-10 codis proxy处理流程
  • 创建Windows服务简单流程
  • Airflow成为Apache软件基金会的顶级项目
  • BZOJ 3039: 玉蟾宫
  • JSP学习笔记(一)
  • 《TCP IP 详解卷1:协议》阅读笔记 - 第六章
  • 继承中代码执行顺序
  • 遍历日志文件并打印
  • Spartan6系列之器件引脚功能详述
  • 【vuex入门系列02】mutation接收单个参数和多个参数
  • 【个人向】《HTTP图解》阅后小结
  • 【刷算法】从上往下打印二叉树
  • const let
  • java取消线程实例
  • leetcode378. Kth Smallest Element in a Sorted Matrix
  • 近期前端发展计划
  • 使用Gradle第一次构建Java程序
  • 新书推荐|Windows黑客编程技术详解
  • 一些css基础学习笔记
  • 走向全栈之MongoDB的使用
  • 做一名精致的JavaScripter 01:JavaScript简介
  • 宾利慕尚创始人典藏版国内首秀,2025年前实现全系车型电动化 | 2019上海车展 ...
  • ​软考-高级-系统架构设计师教程(清华第2版)【第9章 软件可靠性基础知识(P320~344)-思维导图】​
  • ### Error querying database. Cause: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException
  • (4) PIVOT 和 UPIVOT 的使用
  • (C#)一个最简单的链表类
  • (LeetCode) T14. Longest Common Prefix
  • (vue)页面文件上传获取:action地址
  • (八)Spring源码解析:Spring MVC
  • (超简单)构建高可用网络应用:使用Nginx进行负载均衡与健康检查
  • (顶刊)一个基于分类代理模型的超多目标优化算法
  • (附源码)基于SpringBoot和Vue的厨到家服务平台的设计与实现 毕业设计 063133
  • (经验分享)作为一名普通本科计算机专业学生,我大学四年到底走了多少弯路
  • (一)pytest自动化测试框架之生成测试报告(mac系统)
  • (一)Thymeleaf用法——Thymeleaf简介
  • ../depcomp: line 571: exec: g++: not found
  • .NET CF命令行调试器MDbg入门(二) 设备模拟器
  • .NET delegate 委托 、 Event 事件
  • .NET6使用MiniExcel根据数据源横向导出头部标题及数据
  • .NET的微型Web框架 Nancy
  • .NET和.COM和.CN域名区别
  • .net利用SQLBulkCopy进行数据库之间的大批量数据传递
  • .net图片验证码生成、点击刷新及验证输入是否正确
  • .Net小白的大学四年,内含面经
  • .NET中的Exception处理(C#)
  • /bin、/sbin、/usr/bin、/usr/sbin
  • [202209]mysql8.0 双主集群搭建 亲测可用
  • [ASP]青辰网络考试管理系统NES X3.5
  • [BZOJ3757] 苹果树