C++进阶系列:拷贝构造函数与NRV优化

本文探讨了NRV优化与拷贝构造函数的关系,解释了为何定义拷贝构造函数对于NRV优化的重要性,并讨论了现代编译器中NRV优化的变化。

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

《深度探索C++对象模型》第二章67页有:
这个程序的第一个版本不能实施NRV优化,因为test class 缺少一个copy constructor.
也就是缺少拷贝构造函数所以不能NRV优化。

NRV优化和拷贝构造函数是有关系的,只有定义了拷贝构造函数才会开启NRV优化,但现代编译器NRV优化的开启一般都与拷贝构造函数没有关系,

早期的 cfront需要一个开关来决定是否应该对代码实行NRV优化,这就是是否有客户(程序员)显式提供的拷贝构造函数:如果客户没有显式地提供拷贝构造函数,那么cfront认为客户对默认的逐位拷贝语义很满意,由于逐位拷贝本身就是很高效的,所有没必要再对其实施NRV优化;但如果客户显式提供了拷贝构造函数,这说明客户由于某些原因(例如需要深拷贝等)摆脱了高效的逐位拷贝语义,其拷贝动作开销将增大,所以将应对其实施NRV 优化,其结果就是去掉并不必要的拷贝函数调用。

NRV优化会导致原本预想中的调用“拷贝构造函数”变成调用别的“构造函数”,
一旦这个时候,拷贝构造函数和别的构造函数提供的功能不同,就可能会出问题。

参考:
https://www.cnblogs.com/cyttina/archive/2012/11/26/2790076.html
https://book.douban.com/annotation/19292671/

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值