问题标签 [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++ - 为什么这里没有应用 NRVO?
当我在 VS2010 中运行此代码时,未应用 NRVO。
编辑:这与析构函数有关。当我注释掉它的行时,使用的是 NRVO。但这是为什么呢?
c++ - 使用工厂填充元组并避免复制
我正在尝试编写一个(C++98)程序,其中出现以下模式:我有一个非常简单的通用元组类,我需要用使用工厂构造的值填充它。最小的示例代码如下:
输出是
我想摆脱中间的两条线。
为了简化讨论,我们可以在上面的代码中取消注释标记为 (*) 的行;这将破坏通用性,但不会破坏程序。
现在我的主要问题是:我该如何解决这种情况?标准中是否有阻止 RVO 的内容(大概 RVO 必须在这里递归完成)?如果不是,接受编译器不够好,有没有办法让我以明确的方式发生这种情况?我可以使 create() 的调用端复杂化,但我不想使元组中的对象复杂化(特别是,其中一些对象不能默认构造,并且我不想引入额外的“未初始化”向他们说明)。可以 emplace new 也许有帮助吗?
以下问题似乎相关,但最终没有帮助:为什么 RVO 不在这里发生?)
c++ - 为什么要依赖命名返回值优化?
我正在阅读有关 NRVO 的信息,并试图了解什么时候应该依赖它,什么时候不应该依赖它。现在我有一个问题:为什么要完全依赖 NRVO?总是可以通过引用显式传递返回参数,那么有什么理由改用 NRVO 吗?
c++ - C++ 返回值优化
我是 C++ 新手,我在 wiki 和这个网站上阅读了一些关于返回值优化的内容,但是我仍然很好奇以下行为是如何发生的:
输出是:
我的问题是,为什么Foo();
两者A b(Foo());
都只触发了一个复制构造函数调用?这是否意味着返回的复制值Foo()
可以用于b
在该位置构造对象,以便不需要再次调用 b 的构造函数?这是基于视觉工作室 2010。
c++ - NRV(命名返回值)复制构造函数
最近,我在阅读“c++ 的对象模型内部”,在阅读第 5 章时,我提出了以下问题:
即使类具有复制构造函数,编译器也会处理 NRVO 吗?
c++ - RVO 和 NRVO 优化 + C++11 移动运算符
我试图弄清楚 RVO 和 NRVO 如何与新的 C++11 移动运算符一起工作。我用几个例子起草了一个虚拟课程。
编辑:只显示代码的最重要部分。
完整的源代码可在此处获得。
我有两个函数将类作为引用并返回值或引用:
当我调用这些函数时,我有以下输出:
当使用左值引用时,不会调用复制构造函数。否则,那些函数(接收引用作为参数)仍然调用复制构造函数。
此功能编译器是否依赖?难道我做错了什么?
c++ - 为什么 clang 不使用 NRVO 对此进行优化?
我试图解释为什么一个相当好的 C++ 11 编译器(clang)没有优化这段代码,并且想知道这里是否有人有意见。
如果我在#define SLOW
注释掉并优化的情况下运行它,-s
我会得到
这是预期的。
如果我在#define SLOW
启用和优化的情况下运行它,-s
我会得到:
这显然不是那么好。所以问题是:
为什么我没有看到在“慢”情况下应用了 NRVO 优化?我知道编译器不需要应用 NRVO,但这似乎是一个常见的简单案例。
一般来说,我尝试鼓励使用“SLOW”风格的代码,因为我发现它更容易调试。
c++ - 如何使用移动语义按值返回字符串 C++?
我想要一个按值返回字符串的函数,并且我想从该返回值构造另一个字符串。当调用 NRVO/RVO 时,移动构造器工作正常,没有复制,但是当我不能依赖 NRVO 时,即使我明确移动返回值,该函数也会复制字符串。
我打印原始数据地址的值以检查是否制作了副本。
这是代码:
c++ - C++:RVO、NRVO 和返回本地对象
我刚刚阅读了 RVO(返回值优化)和 NRVO(命名返回值优化)。下面是两个例子
这是有道理的,一个不错的编译器优化。但是,我从 Stanley Lippman 的“C++ 入门”中读到“从不返回指向本地对象的引用或指针”(第 6.3.2 章),示例代码是
我不明白,这个示例与 RVO 示例有什么不同吗?如果它们相同,我如何确保编译器会进行 RVO 优化,而不是由于调用堆栈展开而导致未定义的行为?
c++ - C++NRVO 保证?还是更喜欢非常量 ref 参数或 shared_ptr?
自 1992 年以来我一直在使用 C++(并且阅读了大量有关该语言的内容),因此我对该语言有相当多的了解,但远非全部。我的问题是关于 C++11 命名返回值优化 - 有什么保证会执行?我倾向于发送非常量参数(C++97 风格)或使用 shared_ptr(C++11 风格),甚至使用 ptr-to-ptr(C 风格)。一个原因是使用非常量 ref args 或 shared_ptr,我可以保证不会制作额外的对象副本。
所以我的问题是(特别是对于那些从事实时或内核工作的 C++ 程序员):你更喜欢什么习语?我真的希望这个问题不会因为不精确、基于意见或完全愚蠢而被否决——我知道它与高效的现代 C++ 编程高度相关。