问题标签 [rvo]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
1015 浏览

c++ - const 值返回会影响返回值优化吗?

考虑函数

和电话

不管值返回类型是否应该是 const,返回值是 const 的事实是否会阻止编译器执行返回值优化?

我对RVO的理解是,返回的对象直接构造到函数外的变量中。但是,如果返回类型是const T,这与 a 不同T,那么 RVO 会被阻止吗?

0 投票
3 回答
57 浏览

c++ - 返回值优化问题

我在 C++ 中阅读了一些关于 RVO 的内容,并发现了一个奇怪的观察结果。我运行了下面的代码..

我得到了o / p

调用 testFunc 中的临时复制变量实际上会导致一些问题。它删除了 var1 的 ptr 成员,这可以从指针 0xbfe3e918 中对析构函数的调用中看出。在 valgring 下,此代码显示没有内存泄漏,但删除 [] 无效。

我有点困惑如何调用额外的析构函数,为什么没有相应的构造函数调用相同的?

0 投票
1 回答
5203 浏览

c++ - 为什么 Visual Studio 在这种情况下不执行返回值优化 (RVO)

我正在回答一个问题并推荐大型类型的按值返回,因为我确信编译器会执行返回值优化 (RVO)。但后来有人向我指出,Visual Studio 2013 没有在我的代码上执行 RVO。

我在这里发现了一个关于 Visual Studio 无法执行 RVO 的问题,但在这种情况下,结论似乎是,如果它真的很重要,Visual Studio 将执行 RVO。就我而言,这确实很重要,它对性能产生了重大影响,我已经通过分析结果确认了这一点。这是简化的代码:

我期望编译器对来自getBigFoo(). 但它似乎是在复制Foo

我知道编译器将为Foo. 我也知道,与兼容的 C++11 编译器不同,Visual Studio 不会Foo. 但这应该没问题,RVO 是一个 C++98 概念,无需移动语义即可工作。

那么问题来了,Visual Studio 2013 在这种情况下不执行返回值优化是否有充分的理由呢?

我知道一些解决方法。我可以定义一个移动构造函数Foo

这很好,但是有很多遗留类型没有移动构造函数,很高兴知道我可以依赖 RVO 来处理这些类型。此外,某些类型可能本质上是可复制的,但不可移动。

如果我从 RVO 更改为 NVRO(称为返回值优化),那么 Visual Studio似乎确实执行了优化:

这很奇怪,因为我认为 NVRO不如RVO 可靠。

更奇怪的是,如果我更改它的构造函数,Foo它会创建并填充vector

当我尝试做 RVO 时,而不是把它移进去,它可以工作:

我很高兴采用其中一种解决方法,但我希望能够预测 RVO 将来何时会像这样失败,谢谢。

编辑: 来自@dyp 的更简洁的现场演示

Edit2:我为什么不直接写return v;

首先,它没有帮助。Profiler 结果表明,如果我只是编写,Visual Studio 2013 仍然会复制向量return v;,即使它确实有效,也只是一种解决方法。我并没有试图真正修复这段特定的代码,我试图理解 RVO 失败的原因,以便我可以预测它将来何时可能失败。确实,这是编写此特定示例的一种更简洁的方式,但是在很多情况下我不能只编写return v;.,例如,如果Foo有额外的构造函数参数。

0 投票
1 回答
3461 浏览

c++ - 返回锁时的C ++ 11移动

在“C++ Concurrency in Action”一书中阅读以下方法

我不明白为什么 head_lock 在返回时是 std::move-ed。我对移动用法和 RVO 的概念和直觉与C++11 右值和移动语义混淆(return 语句)中共享的观点相匹配

但我倾向于相信作者会更好地了解。有人可以澄清什么时候 std::move 返回值更好,并且有什么特别关于锁的东西吗?谢谢。

0 投票
2 回答
1150 浏览

c++ - 虚函数可以成为 RVO(返回值优化)的候选者吗?

C++ 编译器是否能够将 RVO 应用于虚函数?

在这种情况下:

RVO 可以应用于return result;线路吗?我猜不会。

那么, std::move(result)在这种情况下,返回大容器的方法是什么?

谢谢

0 投票
1 回答
122 浏览

c++ - 具有多个返回的 RVO 运算符

我们正在课堂上使用 RVO 来展示我们如何减少创建的临时对象的数量。

我了解了它的基础知识,但我很难理解如何将多个值组合成一行。

对于单一的临时优化,我能够相当容易地理解它

可以简化为:

但是我不确定如何将它应用于具有多个要返回的值的函数。例如:

我背后的过程是:

它返回一个错误告诉我“ no argument takes the value (float, float)”。

我需要重新组织最初的

Vect2D 运算符 - ( const Vect2D &tmp ) const;

取两个浮点参数?还是我以错误的方式思考这个问题?

谢谢,

E:感谢 Matt 和 Jerry 确认我认为我需要对双浮点运算符做些什么。

0 投票
1 回答
740 浏览

c++ - 传递矢量引用是否会转移其数据的所有权?

传递和转移向量及其数据所有权的最佳方式是什么?

在理想的世界中,它会像这样工作:

这不起作用,因为我正在返回对局部变量的引用。

是否可以使用boost::unique_ptrboost::shared_ptr处理这个向量输出?(不能使用 C++11 的 unique_ptr!)

0 投票
3 回答
107 浏览

c++ - C++11 昂贵的临时右值

我有一些轻物体可以推动和操纵,然后我想将它们包含在一个更复杂的物体中。有一个查找表应该保持不变。这个想法看起来很简单,但是这样做的一行b += c(a);- 会产生一个昂贵的临时性。

我一直在阅读 RVO 和 C++11 的右值,但还不能完全理解它们以完全消除引入的中间值。上面只创建了一个,因为 rhs 的构造函数可用。最初我有这个;

但是,与我的直觉相反,结果count甚至是 2。为什么编译器没有得到我的意图?

0 投票
1 回答
117 浏览

c++ - 为什么返回值必须是 NRVO 的第一个声明的本地值?

我的理解是,要让编译器能够进行命名返回值优化 (NRVO),返回值必须在函数体中的任何其他值之前声明。我怀疑这可能是由于发生异常时堆栈展开的顺序,但我不确定。命名返回值必须是函数体中第一个声明的原因是什么?

用例:

编辑: 感谢所有回答者帮助我理解这一点,我开始怀疑 Chandler Carruth 在此处的声明:http ://www.youtube.com/watch?v= fHNmRkzxHWs 分钟 32:30 可能具有误导性和/或我只是误解它。首先声明返回变量似乎并不重要。

0 投票
1 回答
792 浏览

c++ - munmap_chunk 操作符和析构函数调用时指针无效

我在编写 C++ 代码时遇到了一个奇怪的情况。在我的代码中,我有一个名为C. C将等于矩阵A和的总和B。的值A+B是通过 计算的operator+。当生命C结束时,我面对的是invalid pointer error

这是我的完整代码:

当我运行我的代码时,我遇到了错误的结果和无效的指针错误:

如何解决?

我再次使用 valgrind 运行程序:

似乎 NRVO 没有正确实施!该怎么办?

注意:我编译使用:g++ -g -std=c++11 test.cpp

编辑:

添加这部分代码可以解决问题,但会给我的程序增加负担。我如何享受 NRVO 的优势?