问题标签 [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.
c++ - 传递重物 C++0x
我有一个函数可以生成一种昂贵的对象(包含向量和非固定大小的地图),所以我真的想避免调用复制 c'tors。
到目前为止,我刚刚从该方法返回了一个 std::shared_ptr 并使用了它,但我认为它很难看,需要 typedefing 才能真正可用。
我知道两件事可能对我有帮助。首先是复制省略,其次是移动语义。
我的问题是我知道如何正确使用它们。我的研究告诉我,复制省略完全由编译器完成,而不是标准的一部分。我真的不想仅仅依靠这个。
那么我如何确保调用移动分配并使其到位以防止编译器复制省略。
在这种情况下,这是最正确的编码方式吗?如果不是,我该如何改进它。我很高兴只使用 C++0x 结构。
顺便说一句:我的编译器是 gcc 4.6
c++ - 在移动构造函数中窃取
在一个玩具类的移动构造函数的实现过程中,我注意到了一个模式:
模式显然是:
所以我写了一个预处理器宏来让窃取变得不那么冗长和容易出错:
现在实现如下所示:
这有什么缺点吗?是否有不需要预处理器的更清洁的解决方案?
c++ - 移动操作的条件编译
如何检查我的编译器是否支持右值引用?是否有标准的预处理器宏,或者不同的编译器有不同的宏?理想情况下,我想这样写:
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
。
c++ - 使用可移动类型删除 std::vector 中间的元素是否仍然很昂贵?
通常认为删除 a 中间的元素std::vector
代价高昂,因为它需要复制它之后的每个元素以填充孔。
使用 C++11,std::vector
会将所有元素向下移动,这应该非常快(如果仅与副本相关),至少我认为是这样。当然,它在时间上仍然是线性的,但总的来说它应该比旧版本更快。
这会是真的吗?我不必再担心删除中间的一些对象了吗?
c++ - 为什么有些人使用交换进行移动任务?
例如,stdlibc++ 有以下内容:
为什么不直接将两个 __u 成员分配给 *this 呢?交换是否暗示 __u 被分配了 *this 成员,只是后来分配了 0 和 false ......在这种情况下,交换正在做不必要的工作。我错过了什么?(unique_lock::swap 只是对每个成员执行 std::swap )
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 默认构造函数和移动构造函数也无济于事!
我得到同样的错误!我必须自己明确给出移动构造函数的定义,如果类有很多成员,这很烦人:
c++ - 移动语义——它的全部内容是什么?
可能重复:
有人可以向我解释一下移动语义吗?
有人可以指出一个好的来源或在这里解释什么是移动语义?
c++ - 将左值绑定到右值引用时移动变量的语义和生命周期
只是为了确保很好地理解引擎盖下的内容......问题在代码中作为注释