C++ 的 Copy Elision

本文探讨了C++开发者如何避免不必要的对象拷贝,重点介绍了Copy Elision(拷贝消除),包括强制性与非强制性两种情况,以及它们在C++17之前的实现。通过示例说明了RVO(返回值优化)和NRVO(有名返回值优化)的工作原理。
摘要由CSDN通过智能技术生成

我们都讨厌 copy ?

关于 copy (拷贝) 是我们 C++ 开发者老生常谈的话题,对于 copy 的态度更是能免则免。不必要的拷贝除了会降低程序的性能,还会引发各种令人意想不到的问题,例如 C++ 的 Rule-of-Three 就是关于 C++ 的 copy 的另一个热议话题。


如何避免 copy ?

在 C++ 的世界里,一个对象可以有两种传递方式。一是 pass-by-value (值传递),另一个是 pass-by-address/reference (引用传递) 适用于指针或者引用 。一般我们讨论传递方式是基于把参数传入函数内部。今天我要讨论的 Copy Elision (拷贝消除),简称为 CE, 既涉及函数参数传递,又涉及函数返回值返回。需要注意的是,我对 CE 展开的讨论是基于 C++ 17 版本之前。

CE 在不同的语境下触发的条件也有所不同,分为 Mandatory Elision of Copy (强制性拷贝消除)Non-Mandatory Elision of Copy (非强制性)


强制性 Copy Elision

定义 class Widget ,为了验证函数的调用,在函数体里打印文本。

class Widget
{
   
public:
    Widget() {
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值