什么是复制省略以及如何优化复制和交换习惯用法?
我正在阅读复制和交换。
我尝试阅读Copy Elision上的一些链接,但无法弄清楚它的含义。有人可以解释这个优化是什么,特别是下面的文字是什么意思
这不仅仅是方便的问题,实际上也是一种优化。如果参数绑定到左值(另一个非常量对象),则在创建参数时会自动创建对象的副本。但是,当s绑定到rvalue(临时对象,文字)时,通常会省略该副本,从而保存对复制构造函数和析构函数的调用。在赋值运算符的早期版本中,参数被接受为const引用,当引用绑定到右值时,不会发生复制省略。这导致创建和销毁另外的对象。
没有找到相关结果
已邀请:
2 个回复
骂陋冠
编译器必须调用复制构造函数将
的返回值复制到
。 复制省略是一种跳过调用复制构造函数的技术,以免支付开销。 例如,编译器可以安排
将其返回值直接构造为
。 这是另一个例子。假设你有一个功能:
如果使用实际参数调用它,编译器必须调用复制构造函数,以便不能修改原始参数:
但是现在考虑一个不同的例子,假设你像这样调用你的函数:
将要创建一个临时对象(一个右值)。编译器可以传递由
创建的临时值并将其传递给
,而不是在调用
之前调用复制构造函数。
扭湘阀柿蹄
在
中,行
从复制省略中获益匪浅。如果不允许复制省略,那么该行将需要3次复制构造函数的调用以及对析构函数的相关调用。在允许复制省略的情况下,可以将复制构造函数调整为1,在
内部显式调用
。 如果
已经声明并定义如下:
即使使用copy elision,也必须进行2次复制构造函数的调用。一个构建
,另一个构造
。并且没有复制省略,仍然会有3.这就是为什么声明
所以它的参数需要调用复制结构可以是一个优化时使用'复制和交换'习惯用于赋值运算符。当调用复制构造函数来构造一个参数时,它的调用可能会被省略,但如果它被调用来创建一个局部变量,它可能不会。