问题标签 [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.
c++ - g++:在涉及多个翻译单元的情况下,RVO 如何工作
首先请看下面的代码,它由 2 个翻译单元组成。
请确保 foo.cpp 和 main.cpp 是不同的翻译单元。所以根据我的理解,我们可以说在翻译单元 main.o (main.cpp) 中没有 getFoo() 的实现细节。
但是,如果我们编译并执行上面的代码,我看不到表明 RVO 在这里工作的“Copy Ctor”字符串。
如果你们中的任何人请告诉我如何实现这一点,即使'getFoo()'的实现细节没有暴露给翻译单元main.o,我将不胜感激?
我使用 GCC (g++) 4.4.6 进行了上述实验。
c++ - 返回 std::pair 时会发生 RVO 吗?
一个函数需要向调用者返回两个值。最好的实施方式是什么?
选项1:
选项 1.1:
选项 2:
我知道 Option2 没有副本/移动,但看起来很难看。选项 1、1.1 中是否会发生任何复制/移动?让我们假设 U 和 V 是支持复制/移动操作的巨大对象。
问:理论上是否可以按照标准进行任何 RVO/NRVO 优化?如果是,是否已实现 gcc 或任何其他编译器?
c++ - 如何在 msvc 中强制返回值优化
我在一个类中有一个函数,我希望编译器在......一直使用 NRVO......即使在调试模式下也是如此。对此有语用吗?
这是我的课程在“发布”模式下效果很好:
除非需要超过 _cbStack 字节,否则该类用于在堆栈上创建缓冲区。然后当它销毁时,如果它分配了任何内存,它就会释放内存。当与需要字符串缓冲区的 c 函数交互时,它很方便,并且您不确定最大大小。
无论如何,我试图编写一个可以返回 CBuffer 的函数,就像在这个测试中一样:
我指望 NRVO 让 foo() 快速。在发布模式下,它工作得很好。在调试模式下,它显然会失败,因为我的类中没有复制构造函数。我不想要复制构造函数,因为喜欢复制所有内容 50 次的开发人员将使用 CBuffer。(咆哮:这些家伙正在使用动态数组类创建一个包含 20 个字符的缓冲区以传递给 WideCharToMultiByte(),因为他们似乎忘记了您可以只在堆栈上分配一个字符数组。我不知道是否他们甚至知道堆栈是什么......)
我真的不想编写复制构造函数,以便代码在调试模式下工作!它变得庞大而复杂:
此编译指示不起作用:
有任何想法吗?
c++ - 当复制构造函数在下面的代码中是私有的时,为什么会出现错误 C2248?
此代码error C2248: 'A::A' : cannot access private member declared in class 'A'
在 VS2010 中发出,尽管 RVO 不需要复制构造函数。为了证明这一点,只需将A(const A&);
下面的声明公开,代码将毫无问题地执行,即使没有复制构造函数的定义。
c++ - 为什么 RVO 不适用于移动构造函数?
我正在尝试测试RVO和右值参考。这是代码:
输出是:
环境:WIN8,Visual Studio 2012 Express
这意味着调用了移动构造函数:B(const B&&)。提出了两个问题:
- 为什么这里不应用RVO ?
- 为什么不调用复制构造函数: B(const B&)?
如果我删除B(const B&&),则调用B(const B&) 。奇怪的输出:
B() 0
B(常量 B&) 1
~B() 0
~B() 1
以下是我找到的参考资料:
- 为什么 g++ 在这里不启用 RVO?
- RVO, move operations and a dilemma 但是,它们的场景与我的不同(RVO因功能参数而失败)。
编辑:移动构造函数
应该是B(B&&)。问题是为什么调用构造函数而不是复制构造函数。
c++ - c++11返回值优化还是搬家?
我不明白什么时候应该使用std::move
,什么时候应该让编译器优化......例如:
我应该使用哪个?
c++ - 回溯时如何避免输出参数?
正如我们所知,输出参数真的很糟糕
这里 x 实际上是预期的参数,这是 Linux 系统调用中很常见的做法。但是对于 c++,这似乎不是一个好的编码习惯。
我有一个场景,我必须通过字符串列表回溯,并从每个列表中返回所有可能的字符串组合。
一个简单的回溯解决方案是:
现在,我怎样才能在这里避免输出参数,以便我可以返回输出列表?
c++ - C++ 编译器会优化按值返回的代码吗?
假设我将 Visual Studio 或现代 GCC 与 -O2 一起使用。编译器会S
在内部创建func()
然后将其复制到 amy_result
中,还是my_result
使用构造函数(5, 6, 5 + 6)
创建而不创建临时的S
?
注意: 函数func()
定义及其用法位于单独的 .obj 文件中!
c++ - C++ 返回值优化
我是 C++ 新手,我在 wiki 和这个网站上阅读了一些关于返回值优化的内容,但是我仍然很好奇以下行为是如何发生的:
输出是:
我的问题是,为什么Foo();
两者A b(Foo());
都只触发了一个复制构造函数调用?这是否意味着返回的复制值Foo()
可以用于b
在该位置构造对象,以便不需要再次调用 b 的构造函数?这是基于视觉工作室 2010。
c++ - 将构造函数转换为函数的返回值
即使没有 RVO 进化,是否可以使用转换构造函数而不是复制构造函数从函数返回对象(假设编译器不支持任何此类优化)?问题的关键是 C++ std 告诉了什么,有人可以告诉我吗?我得到了 gcc 并编译了下面的代码,在评论中也有几个问题。