一个函数需要返回两个值给调用者。什么是最好的实现方式?
选项 1:
pair<U,V> myfunc()
{
...
return make_pair(getU(),getV());
}
pair<U,V> mypair = myfunc();
选项 1.1:
// Same defn
U u; V v;
tie(u,v) = myfunc();
选项 2:
void myfunc(U& u , V& v)
{
u = getU(); v= getV();
}
U u; V v;
myfunc(u,v);
我知道选项 2 没有复制/移动,但它看起来很丑。 Option1, 1.1 中会发生任何复制/移动吗?假设 U 和 V 是支持复制/移动操作的大型对象。
问:理论上任何 RVO/NRVO 优化都可以按照标准进行吗?如果是,是否已实现 gcc 或任何其他编译器?
最佳答案
Will RVO happen when returning
std::pair
?
是的,它可以。
Is it guaranteed to happen?
不,不是。
C++11 标准:第 12.8/31 节:
When certain criteria are met, an implementation is allowed to omit the copy/move construction of a class object, even if the copy/move constructor and/or destructor for the object have side effects.
复制省略不是保证的功能。它是允许编译器执行的优化只要他们可以。没有什么特别的 w.r.t std::pair
。如果编译器足够好,可以检测到优化机会,它就会这样做。所以你的问题是特定于编译器的,但是同样的规则适用于 std::pair
和任何其他类。
关于c++ - 返回 std::pair 时会发生 RVO 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14043609/