由于右值引用,在C ++ 0x中是std :: swap atomic吗?

时间:2010-08-10 07:39:36

标签: c++ c++11

由于我们在C ++ 0x中有rvalue引用,在我看来应该可以将std :: swap实现为CAS的原子操作。这是新标准中的情况,如果不是为什么?

3 个答案:

答案 0 :(得分:7)

这不是原子的。原子操作并不便宜,99%的时候你不需要原子性。 (IIRC)有一些其他方法可以获得原子操作,但std::swap()不是其中之一。

答案 1 :(得分:5)

简单回答不,不是真的。

虽然您可以使用CAS来实现原子操作,但在大多数情况下,您必须重新设计部分实现,并且在大多数情况下,您将在所有用法中对性能产生影响。

考虑g ++中向量的当前实现。它有三个指针:beginendend_of_capacity。对于这样的向量,你如何使swap原子?您可以通过将所有三个指针推入动态分配的内存块来简化操作,然后实现原子swap会更简单,只需交换指针即可。问题是你已经为容器添加了额外的内存分配,并且在每次访问容器时都有额外的解除引用操作(迭代器的执行方式与原始实现类似)。

answer阅读FredOverflow,了解移动语义的简单说明。

答案 2 :(得分:1)

并非每个类都有一个移动赋值运算符,它可以比常规赋值运算符更有效地实现。点std::array中具有本机数组作为成员的情况。另一种情况是std::string,其中使用小字符串优化(对于小字符串)。

因此一般你不能用{+ 1}}来表达你在C ++ 98中对std::swap无法解释的移动语义。在某些情况下,它会更好,但不适用于一般情况。