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

c++ - g++:在涉及多个翻译单元的情况下,RVO 如何工作

首先请看下面的代码,它由 2 个翻译单元组成。

请确保 foo.cpp 和 main.cpp 是不同的翻译单元。所以根据我的理解,我们可以说在翻译单元 main.o (main.cpp) 中没有 getFoo() 的实现细节。

但是,如果我们编译并执行上面的代码,我看不到表明 RVO 在这里工作的“Copy Ctor”字符串。

如果你们中的任何人请告诉我如何实现这一点,即使'getFoo()'的实现细节没有暴露给翻译单元main.o,我将不胜感激?

我使用 GCC (g++) 4.4.6 进行了上述实验。

0 投票
4 回答
1312 浏览

c++ - 返回 std::pair 时会发生 RVO 吗?

一个函数需要向调用者返回两个值。最好的实施方式是什么?

选项1:

选项 1.1:

选项 2:

我知道 Option2 没有副本/移动,但看起来很难看。选项 1、1.1 中是否会发生任何复制/移动?让我们假设 U 和 V 是支持复制/移动操作的巨大对象。

问:理论上是否可以按照标准进行任何 RVO/NRVO 优化?如果是,是否已实现 gcc 或任何其他编译器?

0 投票
3 回答
1714 浏览

c++ - 如何在 msvc 中强制返回值优化

我在一个类中有一个函数,我希望编译器在......一直使用 NRVO......即使在调试模式下也是如此。对此有语用吗?

这是我的课程在“发布”模式下效果很好:

除非需要超过 _cbStack 字节,否则该类用于在堆栈上创建缓冲区。然后当它销毁时,如果它分配了任何内存,它就会释放内存。当与需要字符串缓冲区的 c 函数交互时,它很方便,并且您不确定最大大小。

无论如何,我试图编写一个可以返回 CBuffer 的函数,就像在这个测试中一样:

我指望 NRVO 让 foo() 快速。在发布模式下,它工作得很好。在调试模式下,它显然会失败,因为我的类中没有复制构造函数。我不想要复制构造函数,因为喜欢复制所有内容 50 次的开发人员将使用 CBuffer。(咆哮:这些家伙正在使用动态数组类创建一个包含 20 个字符的缓冲区以传递给 WideCharToMultiByte(),因为他们似乎忘记了您可以只在堆栈上分配一个字符数组。我不知道是否他们甚至知道堆栈是什么......)

我真的不想编写复制构造函数,以便代码在调试模式下工作!它变得庞大而复杂:

此编译指示不起作用:

有任何想法吗?

0 投票
1 回答
512 浏览

c++ - 当复制构造函数在下面的代码中是私有的时,为什么会出现错误 C2248?

此代码error C2248: 'A::A' : cannot access private member declared in class 'A'在 VS2010 中发出,尽管 RVO 不需要复制构造函数。为了证明这一点,只需将A(const A&);下面的声明公开,代码将毫无问题地执行,即使没有复制构造函数的定义。

0 投票
1 回答
444 浏览

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

以下是我找到的参考资料:


编辑移动构造函数
应该是B(B&&)。问题是为什么调用构造函数而不是复制构造函数

0 投票
4 回答
112351 浏览

c++ - c++11返回值优化还是搬家?

我不明白什么时候应该使用std::move,什么时候应该让编译器优化......例如:

我应该使用哪个?

0 投票
2 回答
175 浏览

c++ - 回溯时如何避免输出参数?

正如我们所知,输出参数真的很糟糕

这里 x 实际上是预期的参数,这是 Linux 系统调用中很常见的做法。但是对于 c++,这似乎不是一个好的编码习惯。

我有一个场景,我必须通过字符串列表回溯,并从每个列表中返回所有可能的字符串组合。

一个简单的回溯解决方案是:

现在,我怎样才能在这里避免输出参数,以便我可以返回输出列表?

0 投票
5 回答
690 浏览

c++ - C++ 编译器会优化按值返回的代码吗?

假设我将 Visual Studio 或现代 GCC 与 -O2 一起使用。编译器会S在内部创建func()然后将其复制到 amy_result中,还是my_result使用构造函数(5, 6, 5 + 6)创建而不创建临时的S

注意: 函数func()定义及其用法位于单独的 .obj 文件中!

0 投票
1 回答
671 浏览

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

我是 C++ 新手,我在 wiki 和这个网站上阅读了一些关于返回值优化的内容,但是我仍然很好奇以下行为是如何发生的:

输出是:

我的问题是,为什么Foo();两者A b(Foo());都只触发了一个复制构造函数调用?这是否意味着返回的复制值Foo()可以用于b在该位置构造对象,以便不需要再次调用 b 的构造函数?这是基于视觉工作室 2010。

0 投票
1 回答
142 浏览

c++ - 将构造函数转换为函数的返回值

即使没有 RVO 进化,是否可以使用转换构造函数而不是复制构造函数从函数返回对象(假设编译器不支持任何此类优化)?问题的关键是 C++ std 告诉了什么,有人可以告诉我吗?我得到了 gcc 并编译了下面的代码,在评论中也有几个问题。