为什么GCC使用mov / mfence而不是xchg来实现C11的atomic_store?

提贝

C ++及2012年之后的版本中:Herb Sutter-atomic <>武器,每2个中就有2个Herb Sutter认为(大约0:38:20)应该在x86上使用xchg而不是mov/mfence来实现atomic_store他似乎还暗示,这一特定的指令顺序是每个人都同意的。但是,GCC使用后者。为什么GCC使用此特定实现?

简而言之,movandmfence方法更快,因为它不会触发xchg需要花费时间的冗余内存读取x86 CPU始终保证线程之间的写入严格排序,因此足够了。

请注意,某些非常老的CPU在mov指令中存在一个错误,这是xchg有必要的,但这是从很久以前开始的,解决此问题对大多数用户而言不值得。

感谢@amdn以获取有关xchg过去需要使用的旧奔腾CPU中的错误的信息

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么GCC使用Mov而不是推入函数调用?

来自分类Dev

为什么GCC使用Mov而不是推入函数调用?

来自分类Dev

为什么使用xor而不是mov需要更少的字节?

来自分类Dev

为什么要使用push / pop而不是sub和mov?

来自分类Dev

为什么clang和GCC不使用xchg来实现std :: swap?

来自分类Dev

为什么GCC可以消除C11 atomic_load中的内存障碍?

来自分类Dev

为什么GCC可以消除C11 atomic_load中的内存障碍?

来自分类Dev

为什么我可以在gcc -std = c11中使用gets()?

来自分类Dev

为什么C标准C11在gcc中不是默认值?

来自分类Dev

为什么该程序使用gcc而不是g ++进行编译?

来自分类Dev

为什么使用shared_ptr的atomic_load无法使用gcc 4.9编译?

来自分类Dev

LOCK XCHG和MOV + MFENCE在逻辑和性能上有什么区别?

来自分类Dev

为什么GCC会定义一元运算符'&&'而不是仅使用'&'?

来自分类Dev

为什么以下代码使用clang而不是gcc进行编译

来自分类Dev

为什么由 gcc mov 生成两次 asm?

来自分类Dev

C ++ / GCC-为什么要编译

来自分类Dev

使用<atomic>的Spinlock的C ++ 11实现

来自分类Dev

为什么 C# 列表是使用数组而不是链表实现的

来自分类Dev

为什么在GCC(9.3.0)中仍未实现`gets_s()`?

来自分类Dev

为什么要使用链接列表而不是数组或向量实现来实现堆栈或队列?

来自分类Dev

为什么我在Linux中遇到gcc而不是g ++的错误

来自分类Dev

GCC <= 4.9的std :: atomic_store(shared_ptr)的替代品?

来自分类Dev

GCC <= 4.9的std :: atomic_store(shared_ptr)的替代品?

来自分类Dev

非法使用mov / xchg运算符

来自分类Dev

非法使用mov / xchg运算符

来自分类Dev

为什么在构建GCC时未禁用C ++库

来自分类Dev

为什么C11不支持Lambda函数

来自分类Dev

为什么 C11 递归定义字符常量?

来自分类Dev

为什么Haskell使用->而不是=?

Related 相关文章

  1. 1

    为什么GCC使用Mov而不是推入函数调用?

  2. 2

    为什么GCC使用Mov而不是推入函数调用?

  3. 3

    为什么使用xor而不是mov需要更少的字节?

  4. 4

    为什么要使用push / pop而不是sub和mov?

  5. 5

    为什么clang和GCC不使用xchg来实现std :: swap?

  6. 6

    为什么GCC可以消除C11 atomic_load中的内存障碍?

  7. 7

    为什么GCC可以消除C11 atomic_load中的内存障碍?

  8. 8

    为什么我可以在gcc -std = c11中使用gets()?

  9. 9

    为什么C标准C11在gcc中不是默认值?

  10. 10

    为什么该程序使用gcc而不是g ++进行编译?

  11. 11

    为什么使用shared_ptr的atomic_load无法使用gcc 4.9编译?

  12. 12

    LOCK XCHG和MOV + MFENCE在逻辑和性能上有什么区别?

  13. 13

    为什么GCC会定义一元运算符'&&'而不是仅使用'&'?

  14. 14

    为什么以下代码使用clang而不是gcc进行编译

  15. 15

    为什么由 gcc mov 生成两次 asm?

  16. 16

    C ++ / GCC-为什么要编译

  17. 17

    使用<atomic>的Spinlock的C ++ 11实现

  18. 18

    为什么 C# 列表是使用数组而不是链表实现的

  19. 19

    为什么在GCC(9.3.0)中仍未实现`gets_s()`?

  20. 20

    为什么要使用链接列表而不是数组或向量实现来实现堆栈或队列?

  21. 21

    为什么我在Linux中遇到gcc而不是g ++的错误

  22. 22

    GCC <= 4.9的std :: atomic_store(shared_ptr)的替代品?

  23. 23

    GCC <= 4.9的std :: atomic_store(shared_ptr)的替代品?

  24. 24

    非法使用mov / xchg运算符

  25. 25

    非法使用mov / xchg运算符

  26. 26

    为什么在构建GCC时未禁用C ++库

  27. 27

    为什么C11不支持Lambda函数

  28. 28

    为什么 C11 递归定义字符常量?

  29. 29

    为什么Haskell使用->而不是=?

热门标签

归档