在一个 上一个问题, ,看来一个简单的按值返回函数总是复制它的 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 ); 
}
有帮助吗?

解决方案

该标准允许此处任何级别的复制省略:

  • 构造一个本地临时变量,将其复制构造为返回值,并将返回值复制构造为本地“c”。 或者
  • 构造一个本地临时变量,并将其复制构造到“c”中。 或者
  • 使用参数“i,d”构造“c”

其他提示

在标准说拷贝构造不需要使用 - 见12.8 / 15:

  

15每当临时类对象   使用拷贝构造函数被复制,   这个对象和复制有   相同CV-限定类型,一个   实施允许治疗   原件和复印件作为两个   指的是不同的方式   相同的对象,而不是在执行复制   总之,即使类副本   构造函数和析构函数有副作用   效果。

和以类似的静脉更多。

路不通过引用传递参数和分配结果吗?

有一个非常简单的和好办法来避免这样的考虑完全 - 你可以考虑返回一个boost :: shared_ptr的到创建的对象 - 这将是几乎相同的,当谈到实用性,但你的对象肯定不会受到不必要的复制 - 这将是真实的,如果你还回它虽然函数调用几个图层

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top