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

c++ - C++ 标准:通过复制返回以初始化没有 RVO 的引用:是否有任何副本?

让我们考虑下一个示例:

在假设 RVO 被禁止或根本不存在并且以任何方式存在的情况下,是否会或可以big_type()复制?还是将引用直接绑定到return语句中构造的临时变量?

我想确保在结束big_type时只调用一次析构函数any_scope_or_function

我使用 C++14,以防标准版本之间的某些行为发生了变化。

0 投票
1 回答
92 浏览

c++ - c++ 返回值优化

我希望有人可以阐明 RVO 在 g++ 中的作用。我有一些需要修改的第三方软件,我想尽可能地对其进行优化,但我无法弄清楚 RVO 究竟做了什么,以及它何时启动。我目前的结构看起来像:

调用者通常这样使用它:

因为返回是一个引用,所以不需要结构的副本,这对性能来说很好。

我需要修改Foo以使用Bar2而不是Bar其内部结构,但是,我需要保持getBar()接口可供第三方调用者使用。我有一个函数convertBar2ToBar(const struct Bar2 &bar2, struct Bar &bar),它可以有效地在两种结构类型之间进行转换,但我很担心,好像我这样做了:

然后这将返回对堆栈上的变量的引用,该变量可以随意书写。我也可以修改程序以返回如下副本rt

但是现在我担心我的Foo.getBar().getX()速度会很慢,因为它必须转换Bar2rt(不可避免),然后将'rt'复制到调用者的本地上下文中(可以避免???)......我不是清楚 RVO 是否可以防止复制,如果可以,幕后到底发生了什么。

0 投票
1 回答
68 浏览

c++ - 在 return 语句中构造对象时 std::move() 会帮助还是阻止 RVO?

由于来自社区的广泛响应,我提出这个问题是希望能够揭穿来自堆栈溢出用户的特定于实现的响应。

其中哪一个是最佳实践(提供最大的优化)?

编辑: 感谢 Yakk 的直接、尊重的回答。[接受答案]

0 投票
1 回答
485 浏览

c++ - std::move 在返回语句中

例如,我一直密切关注永远不要写std::move在退货声明中建议。除了有一些边缘情况,例如.

我相信以下是另一个std::move可能值得的简单示例-我错过了什么吗?但我不确定为什么,这在未来的 C++ 中会改变吗?

0 投票
0 回答
127 浏览

c++ - 我应该信任 RVO 还是使用移动语义?

我的问题是如何编写创建对象的函数。

例如:

//版本。1个功能:

//版本。2个功能:

主要的:

首选哪个版本的函数?即使vector的内容不是基本类型,Ver.1是否总是保证RVO?

0 投票
1 回答
1561 浏览

c++ - 昂贵的移动类型

我正在阅读官方的 CPPCoreGuidelines 以正确理解什么时候依靠 RVO 可靠,什么时候不可靠。在 F20 处写着:

如果一个类型的移动成本很高(例如,数组),请考虑将其分配到空闲存储区并返回一个句柄(例如,unique_ptr),或者将其传递给非常量目标对象的引用以进行填充(用作外参数)

我知道非 STL 类型没有针对移动进行优化,但是我怎样才能轻松检测到移动成本高昂的其他类型,所以我不会在它们上使用 RVO?

0 投票
1 回答
60 浏览

c++ - 实现与 decalation 分离的库能否从 RVO/NRVO 中受益?

正如标题所示,我正在编写一个带有类模板和几个非模板运算符重载的静态库。类模板在ah中定义,函数在a.cc中定义。

所以我决定继续问 RVO/NRVO 是否可以使库的用户代码受益?

编辑:对此我很抱歉,这是我刚刚问的另一个问题,不应该放在这个问题中。为了让场景更清晰,我实际上是在尝试封装 uint8_t 等类型,并计划自己编写一些大型整数类型。

0 投票
1 回答
72 浏览

c++ - 成员访问的 C++ 副本

我正在做一些实验,看看除了复制省略、RVO、NRVO 案例之外何时执行复制。

所以我写了一些这样的代码:

我收到以下输出:

使用 gcc 编译或使用 -O3 编译并尝试 -std=c++{11,14,17} 都产生相同的输出。

令我惊讶的是,我没想到使用 y.getX(); 时会执行任何复制;到一个 const 变量。这是我经常使用的东西,只是为了简化我在以下代码中对该变量及其成员的访问,但我并没有通过 const 引用执行它,而是我只是使用 const 希望编译器将它视为重命名。

有谁知道为什么要执行该副本?我想到的唯一原因是它使代码线程安全。如果有多个线程处理对象 y,那么我对 const 的分配毕竟不会是那个 const。因为它只会引用对象 y 中的成员 x。这可能会被其他线程更改。但我不确定这是否是真正的意图。

0 投票
3 回答
1668 浏览

c++ - 我可以依靠命名返回值优化复杂的返回类型吗?

考虑这样的事情:

这种方法对于生成子集、排列等问题是相当标准的。但是,我尝试制作一个图表,说明返回值优化应该在这里优化什么,因为该类型的内部数据结构相当复杂(std::unordered_multiset是一个哈希表,并且std::set“通常' 一个二叉搜索树),好吧,我只能希望编译器比我更聪明。

那么,谈论性能和(如果重要的话)C++14,我可以在这里返回一个SetOfSets还是应该通过引用将它作为输出参数传递?

0 投票
2 回答
1664 浏览

c++ - 在 C++ 性能问题中使用 getter 返回地图

我有一个具有 3-4 个类型的数据成员的类std::map<string, vector<string>>,用于缓存数据。它的实例被创建一次,并且数据被填充到来自服务调用的所有映射中。我有用于访问这些地图的 getter 函数。(这也有一些线程锁定逻辑)

这些 getter 函数被调用了很多次,我担心地图对象被复制很多次时的性能。

这些 getter 函数多次从 class 调用B。对 cpp 有中级知识,我知道 getter 会按值返回整个映射。但是,最好是通过引用传递它还是使用指向映射的共享指针(例如存储成员变量m1, m2m3作为shared_ptr<map>

这不是性能问题,编译器会处理吗?

在阅读了一些关于返回值优化的内容并稍微理解之后,编译器可以处理一些优化。这是 RVO 的一部分吗?

先感谢您。