More Effective C++ ——019_理解临时对象的来源

本文详细解释了C++中临时对象的概念及其产生的原因,并探讨了如何通过代码优化减少临时对象带来的性能开销。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

条款十九:理解临时对象的来源

什么叫临时变量?先看下面这个例子:  

template<class T>
  void swap(T& object1, T& object2)
  {
   T temp = object1;
   object1 = object2;
   object2 = temp;
  }

一般人把temp叫做临时变量。但对C++而言,temp根本不是临时变量,它是一个函数的局部对象。
在C++中真正的临时对象是看不见的,它们不出现在源代码中。建立一个没有命名的非堆(non-heap)对象会产生临时对象,因为局部对象生命周期短数据易被销毁,没有临时对象(副本)产生则数据传递不了
临时对象产生时机:
1) 函数参数调用时(为了使函数成功调用而进行隐式类型转换)
2)函数返回对象时


临时对象产生开销

产生临时对象带来构造和析构函数调用的开销,对程序的影响不可忽悠,有两个方法可以消除。
注:一种是重新设计你的代码,不让发生这种类型转换。(见条款5)。另一种方法是通过修改软件而不再需要类型转换(见条款21)。


C++中仅当通过传值(by value)方式传递对象或传递常量引用(reference-to-const)参数时,才会发生这些类型转换。当传递一个非常量引用(reference-to-non-const)参数对象,就不会发生。


函数参数调用时

a)by value——add(T a,T b),add(T* a,T* b)
T不能是数组类型,数组作为函数参数会退化为指针类型就是很好证明(复制指针只需要4个字节内存),但拷贝数组消耗大量内存及降低效率。

b)reference-to-const——add(const T& a)
const 要求不能改变被引用对象的值。所以必须要有临时对象产生,否则,会修改到实参的数值。

c)reference-to-non-const——add( T& a)
没有const 修饰时,引用要求能修改被引用的实参的数值。如果有临时对象产生,则达不到修改实参的效果。


函数返回对象

因为局部对象生命周期有限,无法传递内容出去,需要建立副本。
  
如果你不想付出这样的开销。对于这种函数, 

const Number operator+(const Number& lhs,const Number& rhs);

你可以切换到operator=,而避免开销(见条款22)。
但对于大多数返回对象的函数来说,无法切换到不同的函数,从而没有办法避免构造和释放返回值。至少在概念上没有办法避免它。
可喜的是概念和现实之间又有一个黑暗地带,叫做优化,有时你能以某种方法编写返回对象的函数,以允许编译器优化临时对象。这些优化中,最常见和最有效的是返回值优化(见条款20)


总结:临时对象是有开销的,所以你应该尽可能地去除它们,然而更重要的是训练自己寻找可能建立临时对象的地方。在任何时候只要见到常量引用(reference-to-const)参数,就存在建立临时对象而绑定在参数上的可能性。在任何时候只要见到函数返回对象,就会有一个临时对象被建立(以后被释放)。学会寻找这些对象构造,你就能显著地增强透过编译器表面动作而看到其背后开销的能力。

资源下载链接为: https://pan.quark.cn/s/1bfadf00ae14 在 Linux 系统中,查找域名或主机名对应的 IP 地址是网络管理中的一项基础且关键任务,对于排查网络故障、调试网络问题以及监控网络服务是否正常运行等场景都非常重要。本文将介绍五种在 Linux 终端查询域名 IP 地址的方法。 首先,dig 命令(全称 Domain Information Groper)是一个功能强大的 DNS 查询工具,能够向 DNS 服务器发送查询请求并获取详细的响应信息。如果需要查询单个域名的 IP 地址,可以使用命令 dig 2daygeek.com +short 。此外,还可以通过编写 bash 脚本,将包含域名的文本文件中的域名逐个读取,然后利用 dig 命令进行查询,从而实现批量查询域名 IP 地址的功能。 其次,host 命令是一个简单易用的 DNS 查询工具,主要用于将域名解析为 IP 地址。要获取某个域名的 IP 地址,直接使用 host 2daygeek.com 即可。如果只想显示 IP 地址部分,可以通过管道结合 grep 和 sed 命令来实现,例如:host 2daygeek.com | grep "has address" | sed s/has address/-/g 。 再者,nslookup 命令也是一种常用的 DNS 查询工具,它支持交互式查询 DNS 信息。通过 nslookup 2daygeek.com 可以查询域名的 IP 地址。若要以非交互式的方式只显示 IP 地址,可以使用命令 nslookup 2daygeek.com | awk /^Address:/ {print $2} 。 另外,fping 命令与传统的 ping 命令不同,它不会直接进行 DNS 查询,而是通过发送 ICMP Echo Request(pi
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值