函数需要向调用者返回两个值。最好的实现方式是什么?
选项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);我知道Option2没有拷贝/移动,但它看起来很丑陋。在Option1 1.1中会发生任何拷贝/移动吗?让我们假设U和V都是支持复制/移动操作的巨大对象。
问:根据标准,理论上是否可以进行任何RVO/NRVO优化?如果是,gcc或其他编译器已经实现了吗?
发布于 2012-12-27 01:06:40
返回
std::pair**?**时,是否会发生RVO
是的,它可以。
这肯定会发生吗?
不,不是。
C++11标准:第12.8/31节:
当满足某些条件时,允许实现省略类对象的复制/移动构造,即使对象的复制/移动构造函数和/或析构函数具有副作用。
复制省略并不是一个有保证的功能。这是一种允许编译器在任何时候执行的优化。没有什么特别的w.r.t std::pair。如果编译器足够好,可以检测到优化机会,它就会这么做。所以你的问题是特定于编译器的,但是的,同样的规则也适用于std::pair和任何其他类。
https://stackoverflow.com/questions/14043609
复制相似问题