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或任何其他编译器?
RVO会在返回时发生
std::pair
吗?
是的,它可以.
它有保证会发生吗?
不它不是.
C++ 11标准:第12.8/31节:
当满足某些条件时,允许实现省略类对象的复制/移动构造,即使该对象的复制/移动构造函数和/或析构函数具有副作用.
复制省略不是保证功能.这是编译器才能进行优化时,他们可以.没什么特别的std::pair
.如果编译器足以检测到优化机会,它将会这样做.所以你的问题是编译器特定的,但同样的规则适用std::pair
于任何其他类.
归档时间: |
|
查看次数: |
857 次 |
最近记录: |