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

c++ - 堆栈可以有一个异常安全的方法来返回和删除带有移动语义的顶部元素吗?

在回答关于std::stack::pop() 我声称pop不返回值的原因是出于异常安全原因的问题(如果复制构造函数抛出会发生什么)。

@Konrad评论说,现在有了移动语义,这不再相关。这是真的?

AFAIK,移动构造函数可以 throw,但也许noexcept仍然可以实现。

对于奖励积分,此操作可以提供哪些线程安全保证?

0 投票
1 回答
3007 浏览

c++ - 参考重载,而不是唯一的按值传递+ std::move?

似乎有关 C++0x 右值的主要建议是将移动构造函数和移动运算符添加到您的类中,直到编译器默认实现它们。

但是,如果您使用 VC10,等待是一种失败的策略,因为自动生成可能要到 VC10 SP1,或者在最坏的情况下,VC11 才会出现。很可能,对此的等待将以年为单位。

这就是我的问题。编写所有这些重复的代码并不好玩。而且看着很不爽。但对于那些被认为速度较慢的课程来说,这是一个很受欢迎的负担。对于数百甚至数千个小班来说,情况并非如此。

::sighs:: C++0x 应该让我写更少的代码,而不是更多!

然后我有了一个想法。我猜是很多人分享的。

为什么不通过价值传递一切?std::move + 复制省略不会使这几乎是最优的吗?

示例 1 - 典型的 Pre-0x 构造函数

缺点:右值的浪费副本。

示例 2 - 推荐的 C++0x?

优点:大概是最快的。
缺点:很多代码!

示例 3 - 按值传递 + std::move

优点:没有额外的代码。
缺点:在情况 1 和 2 中浪费了一步。如果SomeClass没有移动构造函数,性能将受到很大影响。


你怎么看?这个对吗?与减少代码的好处相比,所发生的移动是否是普遍可以接受的损失?

0 投票
11 回答
515280 浏览

c++ - 什么是移动语义?

我刚刚听完Scott Meyers关于C++0x的软件工程广播播客采访。大多数新特性对我来说都是有意义的,我现在对 C++0x 感到非常兴奋,除了一个。我仍然没有得到移动语义......它到底是什么?

0 投票
6 回答
1522 浏览

c++ - 移动构造函数/操作符=

我正在尝试了解 C++ 的新功能,即移动构造函数和赋值X::operator=(X&&),我发现了有趣的示例 ,但唯一我什至不理解但更不同意的是移动 ctor 和赋值运算符中的一行(在下面的代码中标记):

所以我的问题是:我必须将 lenght_ 的值设置为零还是可以保持不变?不会有任何内存泄漏,也不会少一个表情。

0 投票
1 回答
568 浏览

c++ - C++0x 中的特殊成员函数

关于特殊成员函数的 Wikipedia 文章不包含对移动构造函数和移动赋值运算符的任何引用。

我想更新条目,但我不确定 0x 标准是怎么说的。

这两个函数的规则是什么?它们是由编译器自动生成的吗?如果是,什么时候生成?


编辑:我已经更新了维基百科页面,如果有人喜欢它,请通过编辑它来帮助社区(如果需要)。

0 投票
3 回答
960 浏览

c++ - std::move 会导致切片吗?

例如,在

将 deriv 切成类型unique_ptr<Base>

0 投票
3 回答
568 浏览

c++ - 移动ctor和移动dtor

正如我在Move constructor/operator=中所问的那样,过了一段时间我已经同意并接受了这个问题的正确答案,我只是在想,如果有类似“移动析构函数”之类的东西会在移动时被调用是否有用每次我们使用 move ctor 或 operator= 时的对象。
通过这种方式,我们只需要在 move dtor 中指定我们想要的内容,以及我们的对象在被移动构造函数使用后如何被取消。如果没有这种语义,看起来每次我写 move ctor 或 operator= 我都必须在它们中明确说明(代码重复/错误介绍)如何使移动的对象无效,这不是我认为的最佳选择。期待您对这个问题的意见。

0 投票
8 回答
392801 浏览

c++ - 什么是 std::move(),什么时候应该使用它?

  1. 它是什么?
  2. 它有什么作用?
  3. 什么时候应该使用它?

好的链接表示赞赏。

0 投票
1 回答
598 浏览

c++ - 只提供一个移动构造函数是不好的形式吗?

我想Foo从函数返回一个不可复制的类型对象。这基本上是一个辅助对象,调用者将使用它来执行一组操作,并使用析构函数在操作完成后执行一些清理。

rvalue references出现之前,我会返回 ashared_ptr<Foo>或类似的东西。使用右值引用,另一种选择是将构造函数和复制构造函数设为私有,并且唯一的公共构造函数是移动构造函数。Foo看起来像这样:

我的问题是这样做是否会是不好的形式,或者看起来是否合理。我想不出这会导致问题或难以阅读的任何原因,但是当涉及到右值引用时,我仍然是一个新手,所以可能有一些我没有想到的考虑因素。

0 投票
3 回答
1309 浏览

c++ - 使用 move 作为线程向量的自定义分配器

我目前正在学习 C++ 中的并发性,并且遇到了使用线程向量的情况,我相信这在 C++0x 中是可能的。但是,我当前的编译器似乎没有移动感知容器的实现,因此我会因为std::thread::thread(const std::thread&)被删除而生成错误,即我只能将移动构造函数/移动赋值与std::thread.

我是否正确地认为我可以通过使用编写自定义分配器来规避这个问题

而不是

? 或者这个主题的一些其他变体(可能使用 MyAllocator::construct 的重载)。

注意:这主要是为了作为一个短期的教育练习和足够好的执行工作来玩转容器中的线程。我只会MyAllocator在这种情况下使用。但是,也请向我指出任何可能已实现此功能的库,以便我可以在源代码上进行戳戳。