问题标签 [move-semantics]

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 投票
5 回答
492 浏览

c++ - 传递重物 C++0x

我有一个函数可以生成一种昂贵的对象(包含向量和非固定大小的地图),所以我真的想避免调用复制 c'tors。

到目前为止,我刚刚从该方法返回了一个 std::shared_ptr 并使用了它,但我认为它很难看,需要 typedefing 才能真正可用。

我知道两件事可能对我有帮助。首先是复制省略,其次是移动语义。

我的问题是我知道如何正确使用它们。我的研究告诉我,复制省略完全由编译器完成,而不是标准的一部分。我真的不想仅仅依靠这个。

那么我如何确保调用移动分配并使其到位以防止编译器复制省略。

在这种情况下,这是最正确的编码方式吗?如果不是,我该如何改进它。我很高兴只使用 C++0x 结构。

顺便说一句:我的编译器是 gcc 4.6

0 投票
5 回答
6253 浏览

c++ - 移动语义 == 自定义交换功能已过时?

最近,出现了很多 关于 如何提供自己的功能的问题。在 C++11 中,将使用和移动语义以尽可能快地交换给定值。当然,这仅在您提供移动构造函数和移动赋值运算符(或使用按值传递的运算符)时才有效。swapstd::swapstd::move

swap现在,鉴于此,是否真的有必要在 C++11中编写自己的函数?我只能想到不可移动的类型,但话又说回来, customswap通常通过某种“指针交换”(又名移动)来工作。也许有某些参考变量?嗯……

0 投票
3 回答
823 浏览

c++ - 在移动构造函数中窃取

在一个玩具类的移动构造函数的实现过程中,我注意到了一个模式:

模式显然是:

所以我写了一个预处理器宏来让窃取变得不那么冗长和容易出错:

现在实现如下所示:

这有什么缺点吗?是否有不需要预处理器的更清洁的解决方案?

0 投票
3 回答
830 浏览

c++ - 移动操作的条件编译

如何检查我的编译器是否支持右值引用?是否有标准的预处理器宏,或者不同的编译器有不同的宏?理想情况下,我想这样写:

0 投票
3 回答
2337 浏览

c++ - C++11 编译器何时会使 RVO 和 NRVO 优于移动语义和 const 引用绑定?

考虑从函数返回启用了移动语义的“整个”对象的情况,如下所示std::basic_string<>

那么我是否真的可以期望做出“最佳”选择是否将返回的字符串与移动语义一起使用,如

或者我是否应该依靠 (N)RVO 与

甚至将 const 引用绑定到临时

如果有的话,有什么方案可以对这些选项做出确定性选择?

编辑 1:请注意,std::wstring上面的用法只是启用移动语义的类型的示例。它也可以换成你的arbitrary_large_structure. :-)

编辑 2:我在 VS 2010 中运行速度优化的发布版本时检查了生成的程序集:

两个最有趣的结果:

  • 明确要求std::move使用report1移动构造函数会使指令计数增加三倍。
  • 正如 James McNellis 在下面的回答中所指出的那样report2并且report3确实生成了相同的程序集,其指令比显式调用少 3 倍std::move
0 投票
5 回答
4490 浏览

c++ - 使用可移动类型删除 std::vector 中间的元素是否仍然很昂贵?

通常认为删除 a 中间的元素std::vector代价高昂,因为它需要复制它之后的每个元素以填充孔。

使用 C++11,std::vector会将所有元素向下移动,这应该非常快(如果仅与副本相关),至少我认为是这样。当然,它在时间上仍然是线性的,但总的来说它应该比旧版本更快。

这会是真的吗?我不必再担心删除中间的一些对象了吗?

0 投票
4 回答
28669 浏览

c++ - 为什么有些人使用交换进行移动任务?

例如,stdlibc++ 有以下内容:

为什么不直接将两个 __u 成员分配给 *this 呢?交换是否暗示 __u 被分配了 *this 成员,只是后来分配了 0 和 false ......在这种情况下,交换正在做不必要的工作。我错过了什么?(unique_lock::swap 只是对每个成员执行 std::swap )

0 投票
1 回答
3559 浏览

c++ - 在 std::pair 中存储不可复制(但可移动)的对象

我正在尝试将不可复制(但可移动)的对象存储在 std::pair 中,如下所示:

但是我在使用 gcc 4.6 时遇到以下编译器错误:

似乎编译器正在尝试调用std::pair<_T1, _T2>::pair(_U1&&, const _T2&)构造函数,这当然是有问题的。编译器不应该调用std::pair<_T1, _T2>::pair(_U1&&, _U2&&)构造函数吗?这里发生了什么?

编辑:好的,我知道提供显式移动构造函数可以解决问题,但我还是有点困惑。

假设我通过继承boost::noncopyable而不是声明我自己的私有复制构造函数来使类不可复制。

以下工作正常,表明隐式生成了移动构造函数:

但是,std::pair它仍然不起作用:

错误:

此外,添加= default-ed 默认构造函数和移动构造函数也无济于事!

我得到同样的错误!我必须自己明确给出移动构造函数的定义,如果类有很多成员,这很烦人:

0 投票
4 回答
7166 浏览

c++ - 移动语义——它的全部内容是什么?

可能重复:
有人可以向我解释一下移动语义吗?

有人可以指出一个好的来源或在这里解释什么是移动语义?

0 投票
6 回答
721 浏览

c++ - 将左值绑定到右值引用时移动变量的语义和生命周期

只是为了确保很好地理解引擎盖下的内容......问题在代码中作为注释