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

提贝

在这个简单的C11程序中

#include <stdatomic.h>

int f(atomic_int* obj) {
  return atomic_load(obj);
}

我希望生成的程序集将包含一个内存屏障。即使负载本身可能是原子的,CPU也会推测(即移动)在整个调用的调用方中对该内存位置的某些读取f但是,gcc -O输出:

        .file   "repro.c"
        .text
        .globl  f
        .type   f, @function
f:
.LFB0:
        .cfi_startproc
        movl    (%rdi), %eax
        ret
        .cfi_endproc
.LFE0:
        .size   f, .-f
        .ident  "GCC: (GNU) 4.9.1"
        .section        .note.GNU-stack,"",@progbits

为什么这里不需要存储障碍?

艺术

英特尔文档说“读取不与其他读取重新排序”(第8.2.2节)

GCCmfence在上生成指令atomic_store据我所知,这足以确保其他CPU看到的写入顺序与进行存储的CPU相同。

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

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

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

atomic_load() 和赋值有什么区别?

来自分类Dev

为什么该程序可以在C11中正常编译而在C99中不能正常编译?

来自分类Dev

C11独立内存障碍LoadLoad StoreStore LoadStore StoreLoad

来自分类Dev

为什么在 C11 中与 bool 的比较不转换为 bool?

来自分类Dev

C11和C ++ 11原子:获取释放语义和内存障碍

来自分类Dev

为什么C99中的此语句在C11中有所更改?

来自分类Dev

C11中“可代表”是什么意思?

来自分类Dev

在C11中什么算作字符类型?

来自分类Dev

在C11中链接翻译单元的规则是什么?

来自分类Dev

在C11中链接翻译单元的规则是什么?

来自分类Dev

MacPorts GCC 4.7 OS-X Mavericks 10.9 C11中未定义的符号“ toupper”

来自分类Dev

在C11中使用strdup

来自分类Dev

可以在svg中消除哪个字符?为什么将圆弧渲染为完整的圆?

来自分类Dev

是否可以在Linux驱动程序中使用C11中的<stdatomic.h>,还是必须使用内存屏障的Linux功能?

来自分类Dev

是否可以在Linux驱动程序中使用C11中的<stdatomic.h>,还是必须使用内存屏障的Linux功能?

来自分类Dev

为什么C ++ 11中需要decltype?

来自分类Dev

为什么在C ++ 11中需要decltype?

来自分类Dev

C11中是否有一种机制可以确保否定整数常数的预期类型?

来自分类Dev

C11内存防护栏用法

来自分类Dev

为什么C11不支持Lambda函数

来自分类Dev

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

来自分类Dev

消除C ++中的内存泄漏

来自分类Dev

在C11 / C ++ 11中,可能在同一内存上混合使用原子/非原子操作吗?

来自分类Dev

C ++ 11标准中的哪个子句可以让我消除下面`A :: operator-()`中的`return`语句中的`A`?

Related 相关文章

  1. 1

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

  2. 2

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

  3. 3

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

  4. 4

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

  5. 5

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

  6. 6

    atomic_load() 和赋值有什么区别?

  7. 7

    为什么该程序可以在C11中正常编译而在C99中不能正常编译?

  8. 8

    C11独立内存障碍LoadLoad StoreStore LoadStore StoreLoad

  9. 9

    为什么在 C11 中与 bool 的比较不转换为 bool?

  10. 10

    C11和C ++ 11原子:获取释放语义和内存障碍

  11. 11

    为什么C99中的此语句在C11中有所更改?

  12. 12

    C11中“可代表”是什么意思?

  13. 13

    在C11中什么算作字符类型?

  14. 14

    在C11中链接翻译单元的规则是什么?

  15. 15

    在C11中链接翻译单元的规则是什么?

  16. 16

    MacPorts GCC 4.7 OS-X Mavericks 10.9 C11中未定义的符号“ toupper”

  17. 17

    在C11中使用strdup

  18. 18

    可以在svg中消除哪个字符?为什么将圆弧渲染为完整的圆?

  19. 19

    是否可以在Linux驱动程序中使用C11中的<stdatomic.h>,还是必须使用内存屏障的Linux功能?

  20. 20

    是否可以在Linux驱动程序中使用C11中的<stdatomic.h>,还是必须使用内存屏障的Linux功能?

  21. 21

    为什么C ++ 11中需要decltype?

  22. 22

    为什么在C ++ 11中需要decltype?

  23. 23

    C11中是否有一种机制可以确保否定整数常数的预期类型?

  24. 24

    C11内存防护栏用法

  25. 25

    为什么C11不支持Lambda函数

  26. 26

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

  27. 27

    消除C ++中的内存泄漏

  28. 28

    在C11 / C ++ 11中,可能在同一内存上混合使用原子/非原子操作吗?

  29. 29

    C ++ 11标准中的哪个子句可以让我消除下面`A :: operator-()`中的`return`语句中的`A`?

热门标签

归档