问题标签 [nrvo]

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 回答
808 浏览

c++ - 使用 std::pair 优化返回值

我目前对 C++17 保证的 RVO 及其含义感到非常困惑。我知道要启动 NRVO,我需要确保

  1. 通过函数的所有可能返回路径返回一个对象的同一个实例,并且

  2. 在调用端使用函数调用初始化关联对象

考虑一个最简单的装饰类 Widget,我想分配一对没有副本的 Widget,然后返回它

没有复制,但现在我尝试使用 make_pair

如果我想使用 make_pair,这真的是唯一可能的选择吗?与第一个功能相比,为什么要涉及移动构造?

0 投票
2 回答
84 浏览

c++ - 为什么在这种情况下调用移动构造函数?

我有以下代码:

SomeClass 仅在构造函数中记录某些内容,因此我可以验证正在调用的内容。

通过发布版本,我有以下输出:

由于复制/移动省略,这是有道理的。我想关闭返回值优化。使用调试版本,我有以下输出:

我认为我可以安全地假设 NRVO si 关闭。我真的很想知道为什么要调用移动构造函数而不是复制构造函数。我的(可能是错误的)理解是,由于 func 中的 someObject 是一个左值,因此应该使用复制构造函数而不是移动构造函数来初始化返回对象。

我错过了什么?有人可以指出标准中阐明该案例的段落吗?

0 投票
2 回答
125 浏览

c++ - 返回默认构造对象是否会阻止 NRVO?

假设我有一个类似的功能:

return {}函数开头的是否会阻止 NRVO?我很好奇,因为这似乎等同于以下内容:

但我不清楚在第一种情况下是否允许编译器执行 NRVO。

0 投票
5 回答
301 浏览

c++ - 如果我在函数中返回一个类,它存储在哪里?

看看我的代码:

我不明白我的返回值存储在哪里?它存储在堆栈中吗?在堆里?在我的程序完成之前它会保留在内存中吗?

如果它存储在堆栈中,我可以确定我的类值永远不会改变吗?

请解释这些回报的机制。如果返回结构与返回类不同?

0 投票
2 回答
95 浏览

c++ - 在 std move 中没有副本的分配

我有一个返回地图的 util 函数

从调用方,我想将地图分配给某个对象的数据字段。我可以:

这会比以下更快吗?

我认为这应该是因为我避免了一份额外的副本?

0 投票
1 回答
66 浏览

gcc - 就现代 C++ 中的 operator+= 而言,对称 operator+?

我正在阅读这篇关于在 Boost.Operator https://www.boost.org/doc/libs/1_69_0/libs/utility/operators.htm#symmetry中实现对称运算符的说明,我怀疑它已经过时了。

讨论围绕着什么是通用实现的最佳方式operator+,如果一致operator+=的话。那里的结论是它是(曾经),

因为当时一些编译器支持 NRVO,而不是 RVO。

现在,由于 NRVO 是强制性的,并且正在执行各种优化,情况仍然如此吗?

例如,在某些情况下现在可能有意义的其他版本是:

或者

给定一个具有构造函数、移动构造函数和合理的类operator+=。例如:

实现对称的最佳方法是什么operator+?这是一组可能的代码

我在https://godbolt.org/z/2YPhcg中尝试了它,并且仅通过计算装配线的数量,所有其他条件都相同可能会告诉你什么是最好的实现。我得到了这些混合的结果:

虽然/*3*/并且/*4*/可以从形式的调用中受益,sum(std::move(a), b)甚至可以从sum(sum(a, c), b).

那么T tmp(a); tmp+=b; return tmp;仍然是最好的实施方式operator+(T [const&], T const&)吗?

看起来如果有一个移动构造函数和一个移动+=,还有其他可能性,但似乎只会在clang中产生更简单的组装。

0 投票
2 回答
71 浏览

c++ - 在这种情况下,(N)RVO 会与我的功能一起应用吗?

我有以下代码:(好吧,实际上它要复杂得多,但我简化了它以使其更容易理解。所以请忽略那些看起来很愚蠢的东西。我无法在我的实际情况下更改它们)

(N)RVO 是否适用于我的功能?我做了一些研究,看起来好像是这样,但我并不真正相信,我想要第二个意见(或更多)。

我正在使用 Visual Studio 2017。

0 投票
0 回答
50 浏览

c++ - VS2017:删除移动构造函数时复制构造函数不起作用

考虑以下代码片段:

这是 RVO 不起作用的情况,因此在从函数返回对象时应该调用 move 构造。但是随着移动构造被删除,我认为应该调用复制构造函数。相反,我在上述环境中收到以下编译错误:

错误 C2280 'Snitch::Snitch(Snitch &&)': 试图引用已删除的函数

此外,当我添加const关键字来返回值类型和局部变量时ab它可以工作。我想后一部分编译是因为编译器“理解”没有办法调用移动构造函数并调用复制构造函数。所以,我不明白为什么初始代码无法编译。

0 投票
1 回答
480 浏览

c++ - C++ 编译器能否为用于返回值的命名 const 变量执行 RVO?

这个问题是此处显示的相关问题的轻微变体。

在 C++17 中,我有一个局部变量,我想将其设为 const 以证明它在根据 Scott Meyers Effective C++ item 3 建议尽可能使用 const创建后未经修改:

编译器能否为 执行(命名)返回值优化txt,即使由于 const-ness 差异而导致的str类型与返回类型不同?foo

0 投票
2 回答
380 浏览

c++ - NRVO for C++ std::string

我尝试查找有关 std::string 命名返回值优化 (NVRO) 的一些信息。我什至不确定这是否适用,但我想知道从可读性和性能 POV 来看哪个会更好。

如评论:

  1. nvro 会在“第一”中执行吗?

  2. 有没有更好(更清洁/性能)的方法来解决这个问题?

我的目的是创建一个辅助函数,它将根据给定的参数连接正确的字符串