复制构造函数对比返回值优化
-
21-08-2019 - |
题
在一个 上一个问题, ,看来一个简单的按值返回函数总是复制它的 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的到创建的对象 - 这将是几乎相同的,当谈到实用性,但你的对象肯定不会受到不必要的复制 - 这将是真实的,如果你还回它虽然函数调用几个图层
不隶属于 StackOverflow