问题标签 [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 投票
1 回答
313 浏览

c++ - 为什么 c++ 在返回本地 std::stringstream 时不使用 RVO?

我已经阅读了很多关于 rvalue 和在 C++ >= 11 中返回局部变量的信息。据我了解,“只按值返回,不要使用移动/前进,不要在方法签名中添加 &&,编译器会优化给你”。

好的,我希望它发生:

我明白了

错误。我不明白,为什么它会尝试复制构造函数?难道它不使用移动构造函数和 c++11 中的所有好东西吗?我使用“--std=c++14”。

0 投票
1 回答
143 浏览

c++ - 引入新变量是否会破坏返回值优化?

我们都知道

Foo将使用返回值优化进行编译,因此即使 的复制构造函数有副作用,也不会进行值复制。但是会

也?第二个构造在调试时会很有帮助。但是我这样做是不是丢掉了一个重要的优化?也许我需要编写一个显式的移动构造函数?

0 投票
1 回答
463 浏览

c++ - 强制使用复制构造函数/避免使用复制构造函数

我目前正在写一个日志类(只是为了练习)并遇到了一个问题。我有两个类: Buffer 类充当临时缓冲区,并在其析构函数中刷新自身。还有返回 Buffer 实例的类 Proxy,这样我就不用一直写 Buffer() 了。

无论如何,这里是代码:

这是输出:

该代码完全符合我的要求,但它取决于 RVO。我多次读到你不应该依赖 RVO,所以我想问我怎么能:

  1. 完全避免 RVO,以便每次都调用复制构造函数
  2. 避免复制构造函数

我已经尝试通过返回引用或移动来避免复制构造函数,但是会出现段错误。我猜那是因为 Proxy::operator<< 中的临时变量在返回期间被删除。

我也对大致相同的完全不同的方法感兴趣。

0 投票
3 回答
235 浏览

c++ - 实现移动构造函数如何影响返回值优化?

考虑以下代码片段:

g++它用and编译得很好,clang++输出是

在这种情况下,RVO 似乎发挥了作用。请注意,没有调用移动构造函数。

但是,如果从上面的代码中删除那个未使用的移动构造函数并且代码片段变成这样:

两者都clang++拒绝g++编译,因为类的复制构造函数A被标记为已删除,所以似乎没有发生 RVO。

删除未使用的移动构造函数如何导致这种情况?

0 投票
4 回答
228 浏览

c++ - 有人可以解释这个 c++ 程序的输出吗?

为什么输出foo3等于3? 我建议,当bar(foo1)被调用时,函数会在堆栈上bar创建一个副本foo1,所以它的值等于 0,当这个值被返回时,复制构造函数foo3再次增加这个值,所以它应该是 2?

提前致谢。

这是我的代码:

输出:

0 投票
0 回答
183 浏览

c++ - 现代 c++ 编译器在什么情况下不执行 rvo?

出于性能原因,我有兴趣确保对函数的返回值执行 RVO。什么会阻止我应该担心的现代 C++ 编译器(例如 gcc、clang 和 msvc 2015)执行这种优化?

澄清编辑:我感兴趣的是识别(希望最终通过某种形式的静态分析,但这可能会在以后出现)何时从函数返回具有昂贵复制构造函数(但便宜的移动构造函数)的特定值,并且不执行 RVO(意味着正在执行不必要的复制构造函数调用)。当 std::move() 调用可以避免这种昂贵的操作时尤其如此。

我特别感兴趣的是编译器实际执行它的情况,而不是 C++ 11 规范允许的情况,我想这比实际实现的情况更广泛。我也对编译器自动使用移动构造函数而不是复制构造函数的情况感兴趣(如果允许的话)。

0 投票
1 回答
1553 浏览

c++ - shared_ptr 按值传递时如何增加计数器?

我在下面有这个示例代码。我对 RVO(返回值优化)以及如何在优化过程中跳过复制构造函数和赋值运算符以及将值的返回直接放在左侧的内存中了解一点。那么如果共享指针是 RVO,共享指针如何知道何时增加它的计数器呢?因为出于某种原因,我认为共享指针类会根据它所做的副本数或分配知道何时增加计数器。

输出:

sp3 计数 = 1


pass_shared_ptr_by_val:计数 sp = 2

pass_shared_ptr_by_val:计数 sp = 3

pass_shared_ptr_by_val:计数 sp1 = 3


pass_shared_ptr_by_ref:计数 sp = 1

pass_shared_ptr_by_ref:计数 sp = 2

pass_shared_ptr_by_ref:计数 sp1 = 2

〜一个

0 投票
1 回答
2772 浏览

c++ - C++返回值优化,多个未命名返回

让我们考虑这两个函数:

这些函数中的每一个在 RVO 方面的实际行为方式当然取决于编译器。但是,我是否可以假设他们两个的 RVO 都很常见?


ps(见答案)功能#1旨在如下:

0 投票
2 回答
150 浏览

c++ - 为什么不在此代码中应用 RVO

有一个带有构造函数的 Complex 类,它为 RVO 打印一条消息。
我已经在 gtest 中测试了 Complex 的 operator+ 方法。
如果发生 RVO,则打印“Complex!!” 留言3次。
但是有“复杂!!” 消息5次。
我认为没有发生 RVO。
我用c++98和c++11编译了这段代码
为什么不会出现RVO?

0 投票
2 回答
7243 浏览

c++ - 在 C++17 中具有不可移动类型和保证 RVO 的多个返回值(结构化绑定)

使用 C++ 17,我们将有可能返回不可移动(包括不可复制)类型,例如std::mutex,通过可以被认为是保证返回值优化 (RVO):通过简化值类别保证复制省略

我们还将有结构化绑定,允许:

或(这里也使用我对构造函数的特征模板参数推导的理解)

但是这些功能是否可以实现这样的功能?

我的想法是,要使其正常工作,它需要在形成std::tupleor时保证聚合构造函数参数的 RVO many,但不会将其命名为 RVO (NRVO),它具体未包含在 P0144R2 提案中吗?


旁注:P0144R2 特别提到只支持移动类型:

2.6 只移动类型

支持仅移动类型。例如: