7

上一个问题中,一个普通的按值返回函数似乎总是将其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

4 回答 4

8

该标准允许在此处进行任何级别的复制遗漏:

  • 构造一个本地临时,将其复制构造为返回值,并将返回值复制构造到本地“c”中。或者
  • 构造一个本地临时文件,并将其复制构造到“c”中。或者
  • 用参数“i,d”构造“c”
于 2009-03-20T12:02:50.753 回答
7

该标准说不需要使用复制构造函数 - 请参阅第 12.8/15 节:

15 每当使用复制构造函数复制临时类对象,并且该对象和副本具有相同的 cv 非限定类型时,允许实现将原始类对象和副本视为引用同一对象的两种不同方式,而不是完全执行复制,即使类复制构造函数或析构函数有副作用。

还有更多类似的情况。

于 2009-03-20T12:02:46.853 回答
0

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

于 2009-03-20T12:40:45.767 回答
-1

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

于 2009-03-20T12:04:07.927 回答