问题标签 [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++ - 返回值优化:我可以避免复制构建巨大的 STL 容器吗?
当我想要一个函数返回一个容器时:
可按以下方式使用:
为了避免复制我的容器的开销,我经常编写函数,以便它只返回一个容器的非常量实例。
可按以下方式使用:
我的努力是否毫无意义,因为我可以确定编译器总是使用返回值优化?
c++ - RVO 和 std::vector 实现
我编写了下面的代码来检查流行的 C++03 编译器是否尽可能实现 RVO。(请参阅我关于 RVO返回值优化的相关问题:我可以避免复制构建巨大的 STL 容器。)。
据我了解,简短的回答是否定的。但我不确定我是否理解。
关于 clang gcc 和 VS9 的 std::vector 实现,我有以下五个问题,请阅读下面的代码和输出:
- 为什么编译器 C Fun1 将向量复制两次?
- 为什么编译器 B 和 C 总是构造至少一个非请求元素?
- 为什么这个非请求元素用编译器 C Fun2 生成两次?
- 为什么保留空间会为编译器 B 和 C 产生一个非请求元素?
- 所有这些标准都符合吗?
- 奖励问题:这一切是否符合用户的期望?
使用流行的 C++11 编译器 A 输出
使用流行的 C++03 编译器 B 输出
使用流行的 C++03 编译器 C 输出
c++ - c++ std::move 在这里不好?
假设我有struct Foo
moveconstructor
和operator=(Foo&&)
,并将其用作数据成员:
万一(2)我实际上不需要std::move
,但是如果我在这里使用它会怎样,这是否会造成不好的影响,例如阻止优化?
并发现更改return foo;
会return std::move(foo);
导致禁用RVO
,但是(2)会导致类似情况吗?如果是这样,为什么?
c++ - 为什么 C++ 析构函数会影响返回值优化的行为
我已将我的代码简化如下。
我想在 function 中利用 RVO(返回值优化)NewIterator
,但出现以下错误:
根据cppreference.com,NewIterator()
应该满足 RVO 的要求。但是,编译器似乎尝试调用 的默认复制构造函数Iterator
,然后由于不可复制而失败Iterator.buffer_
。
好吧,令我惊讶的是,如果我删除Iterator
L#13 中的析构函数,代码可以正常工作。
为什么析构函数会影响编译器的 RVO 行为?
c++ - 如果涉及委托,C++ 中的 RVO 和查询结果作为对象或更好地通过引用传递
我必须决定返回带有对象的查询结果还是通过引用传递给它们。查询将至少委派一次。如果我返回一个对象并进一步委托它,是否有编译器 RVO。这是一个例子:
c++ - 基于作用域的锁守卫和返回值的计时
关于保护和返回值复制的保证时间是什么? 在允许(或实际!)优化的情况下,是否会在持有锁时进行复制,或者可以在函数体返回后完成其中的一些操作?
c++ - 带返回的编译器优化 (std::stringstream ss).str()
以下函数接受一个字符串作为参数,并在经过一些处理后返回另一个。
假设编译器将执行移动优化是否足够公平,并且我不会在每次调用后复制字符串的内容?这个函数应该遵循复制省略 [(N)RVO] 吗?
作为一种做法,这是可取的吗?
因为,否则,我一般遵循通过引用返回字符串的做法。所以,可以说,我的函数签名是:
c++ - 函数返回的 RVO 和 rvalue 是如何工作的?
为了理解编译器如何选择类的构造函数,我编写了以下代码:
根据 Effective Modern C++ 的第 25 项,由于返回值优化,编译器将 w 视为右值引用。所以我期望Widget w(make_widget())
调用移动构造函数。但事实并非如此。此外,它只打印
所以我不知道调用了哪个版本的构造函数。然后我也尝试显式返回右值。即,return std::move(w)
。考虑到上述结果,与我的预期相反,它正确调用了移动构造函数,并打印了
看来我正处于右值的迷宫中。请告诉我那里发生了什么。
c++ - 实现多个返回语句时的奇怪结果c ++
我的应用程序有一个非常奇怪的问题。我正在使用带有 MBED Online IDE 的 STM 开发板 NUCLEO-F411RE。我的函数 myObj() 返回一个对象;返回对象的值被打印到 LCD。
我似乎发现了一些问题,可能与编译器/链接器中的返回值优化有关。我无法在不正确的应用程序代码中解释该问题。
在 myObj() 中添加第二个 return 语句时,开始出现奇怪的行为。使用单个 return 语句一切正常,因此我怀疑存在一些基本问题。
预期的 LCD 结果:dar LCD 结果不正确:条形
代码片段:
c++ - tuple/tie的返回值优化
我正在研究元组/关系的返回值优化,我观察到的行为与我预期的不同。在下面的示例中,我希望移动语义能够发挥作用,它确实如此,但是仍然存在一个复制操作。以下优化后的输出为:
在函数内部创建元组时调用复制构造函数似乎是不必要的。有什么办法可以去掉这个吗?我正在使用 MSVC 2012 编译器。