c++ - gcc 不会合并连续的栅栏
问题描述
对于这段简单的代码
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
而标准并不要求它。我无法在标准中找到对此的要求。
但是,它也可能是缺少优化的简单情况。
推荐阅读
- php - 如何从秒数中减去秒数?
- php - 除了 Mysqli_fetch_array() 之外,还有哪些从 mysql 获取数据的方法;
- python - 引号内的python pandas分隔符导致错误标记
- python - 我应该从 __dir__ 方法隐藏python模块中依赖项的导入吗?
- python - mypy 不支持 NamedTuple 索引?
- jquery - 使用 jquery-csv,无论我访问哪个 csv 文件,总是会出现相同的错误
- javascript - js用异步函数排序
- cakephp - cakephp 4 - 没有数据库的模型
- r - R根据多列上的值将数字四舍五入到不同的位数
- c++ - C ++动态将矢量转换为二维