作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
对于这段简单的代码
std::atomic_int i;
void foo() {
i.store(1);
i.store(2);
}
gcc 为 ARM 生成以下程序集:
movw r3, #:lower16:.LANCHOR0
movt r3, #:upper16:.LANCHOR0
dmb ish
mov r1, #1
mov r2, #2
str r1, [r3]
dmb ish
dmb ish ; why is this not eliminated?
str r2, [r3]
dmb ish
bx lr
你可能会注意到,中间生成了一个重复的栅栏,这似乎是多余的。是 gcc 的优化器无法捕获和消除额外的栅栏的问题还是我遗漏了什么?
顺便说一句,clang 似乎可以处理相邻的栅栏。
最佳答案
是的,它不是,我已经和不同的人争论了一段时间。对于像我这样的外部观察者来说,效果是它将 atomic
视为 volatile
,而标准并不要求它。我在标准中找不到这方面的要求。
但是,这也可能是缺少优化的简单情况。
关于c++ - gcc 不合并连续的栅栏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55620073/
我有一个栅栏的 3D 模型。该模型包含 1 个起始柱和 1 个末端柱,中间有一个连接玻璃板。假设我希望能够指定任意长度的栅栏,并将其放置在虚拟世界中。如果可能的话,我将如何处理原始 3D 模型以将其更
x86指令lfence/sfence/mfence用于实现Linux内核中的rmb()/wmb()/mb()机制。很容易理解,这些用于序列化内存访问。但是,在遇到运行时行为中的错误之前,在编写代码时确
以下代码实现了一些无锁(且无原子!)的线程间通信,这些通信需要使用存储和加载内存屏障,但是C++ 11 release-acquire语义不适当,也不保证正确性。实际上,该算法暴露了对发布获取语义的某
我是一名优秀的程序员,十分优秀!