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

ron*_*nag 7 c++ c++11

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

wil*_*ilx 7

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

  • @Omnifarious:对`swap` 的全局锁定是不够的。`atomic_swap` 对于所有对象修改(例如 `push_back`)必须是原子的,而不仅仅是其他交换。 (2认同)

Dav*_*eas 5

简单回答不,不是真的.

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

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

请阅读FredOverflow的回答,以获得有关移动语义的简单解释.

  • @ronag:[无耻插件](http://stackoverflow.com/questions/3106110/can-someone-please-explain-move-semantics-to-me/3109981#3109981) (2认同)