【发布时间】:2018-08-01 20:26:59
【问题描述】:
我一直在研究复制省略在没有直接分配给左值并且可能被链接或在路上使用时的行为方式,但还没有找到任何具体的答案。
对于初学者,我理解NRVO出现在下面的例子中,返回值是直接在destination变量中构造的:
Type MakeType() {
Type type;
// ...
return type;
}
Type a = MakeType();
但是,假设我们有另一个函数,它以 Type 作为参数:
Type MakeComplexType(/*some signature*/ param_type) {
Type complex_type = param_type
// ...
return complex_type;
}
我们这样称呼它:
Type t = MakeComplexType(MakeType());
- 是否可以将复制省略一直链接到
t? - 如果没有,我们是否可以策略性地使用
std::move,也许在像std::move(MakeType())这样的函数调用本身上,以避免不必要的复制? -
param_type的签名应该是什么,这样对t的上述分配才最有效?
【问题讨论】:
-
如果按值返回,则不需要额外的
std::move,它甚至会损害性能 -
stackoverflow.com/a/9595610/3783662 这个答案很好地解释了它。对于您的示例,您可以做的最好的事情是在函数中,将输入参数移动到新的本地对象中。这是一个动作。其余的将是 nrvo 和复制省略
-
Type complex_type = param_type;不是复制省略上下文,std::move(MakeType())是一种悲观化,因为MakeType()是一个prvalue -
没有办法让
MakeType()在t中构造为您上次调用中的语法
标签: c++ optimization move-semantics copy-elision