返回std :: pair时会发生RVO吗?

bal*_*lki 7 c++ rvo nrvo c++11 std-pair

函数需要向调用者返回两个值.实施的最佳方式是什么?

选项1:

pair<U,V> myfunc()
{
...
return make_pair(getU(),getV());
}

pair<U,V> mypair = myfunc();
Run Code Online (Sandbox Code Playgroud)

选项1.1:

// Same defn
U u; V v;
tie(u,v) = myfunc();
Run Code Online (Sandbox Code Playgroud)

选项2:

void myfunc(U& u , V& v)
{
u = getU(); v= getV();
}

U u; V v;
myfunc(u,v);
Run Code Online (Sandbox Code Playgroud)

我知道Option2,没有副本/移动,但它看起来很难看.Option1,1.1中是否会出现任何副本/移动?让我们假设U和V是支持复制/移动操作的巨大对象.

问:根据标准,理论上任何RVO/NRVO优化理论上是否可行?如果是,是否已实现gcc或任何其他编译器?

Alo*_*ave 8

RVO会在返回时发生std::pair吗?

是的,它可以.

它有保证会发生吗?

不它不是.


C++ 11标准:第12.8/31节:

当满足某些条件时,允许实现省略类对象的复制/移动构造,即使该对象的复制/移动构造函数和/或析构函数具有副作用.

复制省略不是保证功能.这是编译器才能进行优化时,他们可以.没什么特别的std::pair.如果编译器足以检测到优化机会,它将会这样做.所以你的问题是编译器特定的,但同样的规则适用std::pair于任何其他类.