问题标签 [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.
c++ - 使用 std::pair 优化返回值
我目前对 C++17 保证的 RVO 及其含义感到非常困惑。我知道要启动 NRVO,我需要确保
通过函数的所有可能返回路径返回一个对象的同一个实例,并且
在调用端使用函数调用初始化关联对象
考虑一个最简单的装饰类 Widget,我想分配一对没有副本的 Widget,然后返回它
没有复制,但现在我尝试使用 make_pair
如果我想使用 make_pair,这真的是唯一可能的选择吗?与第一个功能相比,为什么要涉及移动构造?
c++ - 为什么在这种情况下调用移动构造函数?
我有以下代码:
SomeClass 仅在构造函数中记录某些内容,因此我可以验证正在调用的内容。
通过发布版本,我有以下输出:
由于复制/移动省略,这是有道理的。我想关闭返回值优化。使用调试版本,我有以下输出:
我认为我可以安全地假设 NRVO si 关闭。我真的很想知道为什么要调用移动构造函数而不是复制构造函数。我的(可能是错误的)理解是,由于 func 中的 someObject 是一个左值,因此应该使用复制构造函数而不是移动构造函数来初始化返回对象。
我错过了什么?有人可以指出标准中阐明该案例的段落吗?
c++ - 返回默认构造对象是否会阻止 NRVO?
假设我有一个类似的功能:
return {}
函数开头的是否会阻止 NRVO?我很好奇,因为这似乎等同于以下内容:
但我不清楚在第一种情况下是否允许编译器执行 NRVO。
c++ - 如果我在函数中返回一个类,它存储在哪里?
看看我的代码:
我不明白我的返回值存储在哪里?它存储在堆栈中吗?在堆里?在我的程序完成之前它会保留在内存中吗?
如果它存储在堆栈中,我可以确定我的类值永远不会改变吗?
请解释这些回报的机制。如果返回结构与返回类不同?
c++ - 在 std move 中没有副本的分配
我有一个返回地图的 util 函数
从调用方,我想将地图分配给某个对象的数据字段。我可以:
这会比以下更快吗?
我认为这应该是因为我避免了一份额外的副本?
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中产生更简单的组装。
c++ - 在这种情况下,(N)RVO 会与我的功能一起应用吗?
我有以下代码:(好吧,实际上它要复杂得多,但我简化了它以使其更容易理解。所以请忽略那些看起来很愚蠢的东西。我无法在我的实际情况下更改它们)
(N)RVO 是否适用于我的功能?我做了一些研究,看起来好像是这样,但我并不真正相信,我想要第二个意见(或更多)。
我正在使用 Visual Studio 2017。
c++ - VS2017:删除移动构造函数时复制构造函数不起作用
考虑以下代码片段:
这是 RVO 不起作用的情况,因此在从函数返回对象时应该调用 move 构造。但是随着移动构造被删除,我认为应该调用复制构造函数。相反,我在上述环境中收到以下编译错误:
错误 C2280 'Snitch::Snitch(Snitch &&)': 试图引用已删除的函数
此外,当我添加const
关键字来返回值类型和局部变量时a
,b
它可以工作。我想后一部分编译是因为编译器“理解”没有办法调用移动构造函数并调用复制构造函数。所以,我不明白为什么初始代码无法编译。
c++ - NRVO for C++ std::string
我尝试查找有关 std::string 命名返回值优化 (NVRO) 的一些信息。我什至不确定这是否适用,但我想知道从可读性和性能 POV 来看哪个会更好。
如评论:
nvro 会在“第一”中执行吗?
有没有更好(更清洁/性能)的方法来解决这个问题?
我的目的是创建一个辅助函数,它将根据给定的参数连接正确的字符串