问题标签 [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.
c++ - const 值返回会影响返回值优化吗?
考虑函数
和电话
不管值返回类型是否应该是 const,返回值是 const 的事实是否会阻止编译器执行返回值优化?
我对RVO的理解是,返回的对象直接构造到函数外的变量中。但是,如果返回类型是const T
,这与 a 不同T
,那么 RVO 会被阻止吗?
c++ - 返回值优化问题
我在 C++ 中阅读了一些关于 RVO 的内容,并发现了一个奇怪的观察结果。我运行了下面的代码..
我得到了o / p
调用 testFunc 中的临时复制变量实际上会导致一些问题。它删除了 var1 的 ptr 成员,这可以从指针 0xbfe3e918 中对析构函数的调用中看出。在 valgring 下,此代码显示没有内存泄漏,但删除 [] 无效。
我有点困惑如何调用额外的析构函数,为什么没有相应的构造函数调用相同的?
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
有额外的构造函数参数。
c++ - 返回锁时的C ++ 11移动
在“C++ Concurrency in Action”一书中阅读以下方法
我不明白为什么 head_lock 在返回时是 std::move-ed。我对移动用法和 RVO 的概念和直觉与C++11 右值和移动语义混淆(return 语句)中共享的观点相匹配
但我倾向于相信作者会更好地了解。有人可以澄清什么时候 std::move 返回值更好,并且有什么特别关于锁的东西吗?谢谢。
c++ - 虚函数可以成为 RVO(返回值优化)的候选者吗?
C++ 编译器是否能够将 RVO 应用于虚函数?
在这种情况下:
RVO 可以应用于return result;
线路吗?我猜不会。
那么, std::move(result)
在这种情况下,返回大容器的方法是什么?
谢谢
c++ - 具有多个返回的 RVO 运算符
我们正在课堂上使用 RVO 来展示我们如何减少创建的临时对象的数量。
我了解了它的基础知识,但我很难理解如何将多个值组合成一行。
对于单一的临时优化,我能够相当容易地理解它
可以简化为:
但是我不确定如何将它应用于具有多个要返回的值的函数。例如:
我背后的过程是:
它返回一个错误告诉我“ no argument takes the value (float, float)
”。
我需要重新组织最初的
Vect2D 运算符 - ( const Vect2D &tmp ) const;
取两个浮点参数?还是我以错误的方式思考这个问题?
谢谢,
E:感谢 Matt 和 Jerry 确认我认为我需要对双浮点运算符做些什么。
c++ - 传递矢量引用是否会转移其数据的所有权?
传递和转移向量及其数据所有权的最佳方式是什么?
在理想的世界中,它会像这样工作:
这不起作用,因为我正在返回对局部变量的引用。
是否可以使用boost::unique_ptr
或boost::shared_ptr
处理这个向量输出?(不能使用 C++11 的 unique_ptr!)
c++ - C++11 昂贵的临时右值
我有一些轻物体可以推动和操纵,然后我想将它们包含在一个更复杂的物体中。有一个查找表应该保持不变。这个想法看起来很简单,但是这样做的一行b += c(a);
- 会产生一个昂贵的临时性。
我一直在阅读 RVO 和 C++11 的右值,但还不能完全理解它们以完全消除引入的中间值。上面只创建了一个,因为 rhs 的构造函数可用。最初我有这个;
但是,与我的直觉相反,结果count
甚至是 2。为什么编译器没有得到我的意图?
c++ - 为什么返回值必须是 NRVO 的第一个声明的本地值?
我的理解是,要让编译器能够进行命名返回值优化 (NRVO),返回值必须在函数体中的任何其他值之前声明。我怀疑这可能是由于发生异常时堆栈展开的顺序,但我不确定。命名返回值必须是函数体中第一个声明的原因是什么?
用例:
编辑: 感谢所有回答者帮助我理解这一点,我开始怀疑 Chandler Carruth 在此处的声明:http ://www.youtube.com/watch?v= fHNmRkzxHWs 分钟 32:30 可能具有误导性和/或我只是误解它。首先声明返回变量似乎并不重要。
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 的优势?