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

标签 c++ c++11 std-pair rvo nrvo

一个函数需要返回两个值给调用者。什么是最好的实现方式?

选项 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/

相关文章:

c++ - 如何接受通用迭代器?

c++ - OpenCV:16 位灰度图像的归一化结果较弱

c++ - qt 插槽中的信令失败

c++ - 用于 C++ 的 Win32 CRITICAL_SECTION 的轻量级跨平台替代品?

c++ - 如何读取二进制数据并转换为无符号字符 (C++)

c++ - 将成员函数作为参数传递给其他成员函数 (C++ 11 <function>)

c++11 - 是否可以使用大括号初始值设定项来删除结构数组?

c++ - 在给定键的情况下获取 2D Vector 中的值

c++ - 在映射中插入一对时,C++ 是否需要额外的代码?

c++ - 我可以制作两个 std::ostream-s 的 std::pair 吗?