问题标签 [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 回答
124 浏览

c++ - RVO 何时表现出最大的性能影响?

我花了一点时间试图了解 RVO 性能影响是否与我想象的一样有价值。

这是我的基准代码(主要思想是创建大结构并从函数中返回它们):

在我的 MacBook Pro 上,这个基准测试显示了在使用和不使用 RVO 优化的情况下几乎相同的性能。

有了这样的结果,人们可能倾向于总是使用按值返回技术,因为即使编译器不提供 RVO,它在语义上看起来也更好。RVO 何时真正产生显着的性能影响?

链接到基准要点

0 投票
3 回答
115 浏览

c++ - 按包含成员向量的值返回对象是不是一个坏主意?

精简版:

如果我的对象包含一个 std::vector,是否适用于按值返回该对象与按值返回向量相同的经验法则?

这在 C++11 中是否发生了变化,我理解“保证”按值返回向量很快?

长版:

我有一个包含 std::vector 的小型包装类。

我想从某些函数返回这个类的实例,例如:

我已经找到了大量关于如何返回成员向量以及返回 std::vector是否仍然是一种糟糕的设计模式的信息(在大多数情况下似乎这很好)。不过,我还没有找到很多包含较大对象成员的向量。

同样的建议是否适用?我是否需要在我的复制构造函数中做任何特别的事情来帮助确保返回值优化?

对于不同版本的 C++ 标准,这个问题的答案是否不同?

0 投票
0 回答
16 浏览

c++ - 编译器什么时候可以做返回值优化

我遇到了 rvo(返回值优化),老实说,我对 rvo 有三个问题。

  1. 在哪些情况下编译器必须执行 rvo(根据标准兼容)?
  2. 在哪些情况下不允许编译器执行 rvo(根据标准兼容)?
  3. 在哪些情况下编译器不能执行 rvo?
0 投票
2 回答
405 浏览

c++ - 从类方法返回成员 unique_ptr

我正在尝试将std::unique_ptr class成员(试图转移所有权)返回给调用者。以下是示例代码片段:

我认为编译器(gcc-5.2.1)在这种情况下能够进行返回值优化(复制省略),而不需要通过std::move(). 但事实并非如此。为什么不?

以下代码似乎工作正常,这似乎等效:

0 投票
2 回答
458 浏览

c++ - RVO 是否适用于这种情况?

假设我们有这种情况

RVO 在这里应用吗?我认为答案是否定的,因为应用 RVO 的规则之一是:“如果函数按值返回类类型,并且 return 语句的表达式是具有自动存储持续时间的非易失性对象的名称,则t 函数参数,或 catch 子句参数,并且与函数的返回类型具有相同的类型(忽略顶级 cv 限定),则省略复制/移动“并且在这种情况下,返回的对象不具有与函数的返回类型相同的类型,但我不是 100% 不在这里应用 RVO。

非常感谢。

PS。在本次演讲中https://www.youtube.com/watch?v=AKtHxKJRwp4(第 40 分钟,第 18 秒)来自 Microsoft 的 Stephan 谈到了无法应用 RVO 的情况,因为函数的返回类型不同于返回对象的类型(在他的示例中为元组与对)。我认为同样的原则也适用于此。

0 投票
0 回答
117 浏览

c++ - (N)RVO 是否适用于大小相同的子对象(成员或基础)?

使用 RVO,我们可以从函数返回局部变量,而不会产生复制成本。这在返回变量的子对象时也有效吗?

从其他答案中,我收集到当完整对象的大小大于要返回的对象时,它不会,因为它不适合为返回值保留的空间。但是如果整个对象是“空的”,即大小与子对象相同,那又如何呢?


我问这个问题的理由:

假设我有一个简单的对象

和一个包装类,它只是作为数据的更智能视图:

这被一些返回Data以简化实现的函数在内部使用,但接口没有反映这一点(即函数不返回包装器本身)。所以我可能有一个功能:

由于这个用例对于我的包装器来说很常见,我想用一个封装它的类来替换它。makeTheData即,我将用包含Data子对象和包装器功能的单个本地对象替换前两行。

这将有助于实现包装器的常见用例。该ContainingWrapper对象与对象具有相同的大小Data,因此 RVO 在技术上应该是可行的。

能否在不损失 RVO 性能(至关重要)的情况下实现此功能(使用成员或基础子对象,或者可能使用不同的方法)?as if规则是否适用并允许优化器将第二个实现makeTheData转换为第一个实现,从而使 RVO 成为可能?

0 投票
1 回答
506 浏览

c++ - C++11 是否保证 return 语句中的局部变量将被移动而不是复制?

coll一个xvaluereturn A{ coll };

A(vector<int>&&)返回时是否会调用C++11 保证f

0 投票
1 回答
455 浏览

c++ - C++ RVO:什么时候发生?

http://coliru.stacked-crooked.com/a/c795a5d2bb91ae32

函数的最后一行有什么区别f(X a): return a;而不是return std::move(a);?

功能f没有RVO但g有NRVO是真的吗?

0 投票
2 回答
314 浏览

c++ - 为什么调用移动构造函数?

鉴于我对返回值优化的理解,我对为什么在下面的示例代码中调用移动构造函数感到困惑:

输出:

我假设只有一个 MyCustomType 实例被构造并直接分配给_t.

有关信息,我正在使用 VC14 编译器。

0 投票
1 回答
122 浏览

c++ - RVO:即使显式分配给 const 引用,也按值传递返回值

我有一个设置框架,它最终将值缓存到一个std::mapof 中boost::any

由于我不希望客户端处理异常,它提供了一个默认值,设置框架将在设置检索失败的情况下回退:这迫使我通过复制返回设置值。

现在,我并不认为这有什么大不了的,因为我认为多亏了 RVO 魔术,对设置框架拥有的缓存值的引用会被返回——尤其是当客户端显式地将返回值封装在 const 引用中时!

根据我的测试,情况似乎并非如此。