Copy Elision
我们都讨厌 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() {