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

c++ - 对按值返回的值使用 const 引用

看下面的例子:

我知道 RVO 和 NRVO,但我认为为了做到这一点,我需要编写 bar 如下:

两个版本似乎都有效,我相信具有相同的性能。使用第一个版本(带有 const 参考)是否安全?

谢谢。

0 投票
3 回答
5799 浏览

c++ - C++ 统一赋值运算符移动语义

编辑:已解决见评论——不知道如何在没有答案的情况下标记为已解决。

在观看了有关 C++0x 中的完美转发/移动语义的第 9 频道视频后,我有些相信这是编写新赋值运算符的好方法。

这应该允许将 r 值和 const& s 分配给它。通过使用适当的构造函数构造一个新对象,然后用 *this 交换内容。这对我来说似乎是合理的,因为没有数据被复制超过它需要的。指针算法很便宜。

但是我的编译器不同意。(g++ 4.6) 我得到了这些错误。

难道我做错了什么?这是不好的做法(我认为没有办法测试你是否是自我分配的)?编译器还没有准备好?

谢谢

0 投票
6 回答
2069 浏览

c++ - 返回值优化 - C++ - 析构函数调用

以下代码调用析构函数 4 次:

输出:

有人可以解释一下吗?我在想应该只有三个析构函数调用。

0 投票
2 回答
1662 浏览

c++ - 为什么 g++ 在这里不启用 RVO?

考虑一下测试代码:

编译:

输出是:

我期待编译器使用 RVO 机制来省略每个 COPY CTOR 调用,以避免复制函数的返回值和参数create()。为什么不是这样?

0 投票
2 回答
2710 浏览

c++ - 为什么在返回参数时不允许 RVO?

在 [C++11: 12.8/31] 中有说明:

这种复制/移动操作的省略,称为复制省略,是允许的[...]:

— 在具有类返回类型的函数的 return 语句中,当表达式是具有与函数返回类型相同的 cv 非限定类型的非易失性自动对象(函数或 catch 子句参数除外)的名称时,可以通过将自动对象直接构造到函数的返回值中来省略复制/移动操作

这意味着

将打印

为什么需要第二个复制构造函数?编译器不能简单地延长x的生命周期吗?

0 投票
6 回答
430 浏览

c++ - 当 RVO/NRVO 启动时,对象是否被复制?

我无法理解 RVO(和 NRVO)的定义,因为像这样的多个问题在我看来假设 RVO 省略了复制构造函数。现在根据 12.8.15

在这种情况下,实现将省略的复制操作的源和目标简单地视为引用同一对象的两种不同方式,并且该对象的销毁发生在两个对象本应被销毁的较晚时间优化。

看起来不是复制构造函数调用被省略,而是复制本身 - 只是对象首先在“复制”位置构造,因此没有“原始”对象,根本没有复制。因此,即使一个类有一个private复制构造函数,它也可以在 RVO 启动时从函数中返回,因为没有复制。

我做对了吗?是复制本身省略还是复制构造函数调用省略?当对象类具有私有复制构造函数时,是否应允许从函数返回对象?

0 投票
4 回答
1107 浏览

c++ - 当复制构造函数是私有且未实现时是否允许 RVO?

假设我有一个类,其中复制构造函数是私有的且未实现(使对象不可复制)

现在在同一个类的一些成员函数中,我编写了返回该类对象的代码:

这是 RVO 可以介入的情况。

RVO 仍然要求可以访问复制构造函数。由于对复制构造函数的可能调用是在同一个类成员函数中完成的,因此复制构造函数是可访问的。因此,尽管意图是禁止使用复制构造函数,但从技术上讲,RVO 是可能的。

在这种情况下是否允许 RVO?

0 投票
2 回答
403 浏览

c++ - 大向量的返回值优化与 auto_ptr

如果我使用 auto_ptr 作为填充大向量的函数的返回值,这会使该函数成为源函数(它将创建一个内部 auto_ptr 并在返回非 const auto_ptr 时传递所有权)。但是,我不能将此函数与 STL 算法一起使用,因为为了访问数据,我需要取消对 auto_ptr 的引用。我猜一个很好的例子是一个大小为 N 的向量字段,每个向量有 100 个分量。如果 N 很大,该函数是否按值或按 ref 返回每个 100 个分量向量是不一样的。

另外,当我尝试这个非常基本的代码时:

autoFun 和 fun 调用都会产生输出

博士

所以我实际上看不到正在创建以传递给 return 语句的自动变量。这是否意味着为 valueFun 调用设置了返回值优化?在这种情况下 valueFun 是否会创建两个自动对象?

然后,如何使用函数优化如此庞大的数据结构的种群?

0 投票
3 回答
198 浏览

c++ - C++ 返回一个对象副本

我写了以下代码:

在我的程序的某个时刻,我尝试使用该getMyObject方法并仅const在检索到的对象上使用方法:

  • 现在,编译器是否有可能优化此代码以便不完成任何副本std::vector<int>

    编译器是否有可能确定我只使用const检索到的对象上的方法(假设mutable它背后没有发生废话)并且它不会制作对象的任何副本并对成员执行这些const操作private相反MyObjectHolder

  • 如果是,如果我没有明确声明const std::vector<int> myObjectas是否有可能const

  • 如果不是,不这样做的原因是什么?在哪些情况下,这种优化将难以实施/推断它是可能的并且在这里/等等......?

0 投票
3 回答
2180 浏览

c++ - 我什么时候应该选择复制省略而不是通过 const 引用传递参数?

可能重复:
按值传递是 C++11 中合理的默认值吗?

我在读想要速度?按值传递。戴夫亚伯拉罕关于复制省略和 RVO。我想知道为什么我们需要复制省略?

我被告知太多次,你应该通过 const 引用传递函数参数以避免复制(我读过的几乎每一本 c++ 书籍都告诉我这一点)。

假设我们有两个函数:

如果实际参数是右值,则在两个函数中都将避免复制。但是如果实际参数是一个左值,复制只会在 f1 中避免,而不是在 f2 中。那么为什么我们需要这个功能呢?