一个函数需要向调用者返回两个值,最好的实现方式是什么?
选项1:
选项2:
选项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或其他编译器实现了?
std::pair
的任何事情会阻止RVO / NRVO。通常很容易通过包含一个复制构造函数来测试,该构造函数告诉您何时发生复制。 - Jerry Coffin