复制构造函数与返回值优化

时间:2009-03-20 11:54:08

标签: c++ copy-constructor return-value-optimization

previous question中,似乎一个普通的按值返回函数总是将其return参数复制到从中分配的变量中。

这是标准所要求的,还是可以通过构建'赋值'变量来优化函数,即使在函数体内也是如此?

struct C { int i; double d; };

C f( int i, int d ) {
    return C(i,d); // construct _and_ copy-construct?
}

int main() {
    C c = f( 1, 2 ); 
}

4 个答案:

答案 0 :(得分:7)

标准规定不需要使用复制构造函数 - 参见12.8 / 15节:

  

15每当一个临时类对象   使用复制构造函数复制,   而这个对象和副本有   相同的cv不合格类型,a   允许实施处理   原件和副本为两件   不同的方式指的是   相同的对象,而不是执行副本   所有,即使班级复制   构造函数或析构函数有侧面   效果。

还有更多类似的东西。

答案 1 :(得分:7)

该标准允许任何级别的复制遗漏:

  • 构造一个本地临时文件,将其复制 - 构造成一个返回值,并将返回值复制 - 构造到本地“c”中。
  • 构造一个本地临时,并将复制构造成“c”。
  • 使用参数“i,d”构建“c”

答案 2 :(得分:0)

方式不通过引用传递参数并将结果分配给它?

答案 3 :(得分:-1)

有一种非常简单和好的方法可以完全避免这些考虑因素 - 您可以考虑将boost :: shared_ptr返回给创建的对象 - 在可用性方面它实际上是相同的但是您的对象肯定不会被不必要地复制 - 如果你通过几层函数调用返回它也是如此。