如果与memory_order_acquire一起存储会发生什么
what happened if store with memory_order_acquire
正如我们所知: 加载memory_order_acquire, 与memory_order_release一起存储 然而 我发现使用 gcc4.8.2,打开 -O2,抛出编译错误, /usr/include/c++/4.8.2/atomic:199:9:错误:"__atomic_store"的内存模型无效 但如果接近-O2,错误消失了
此外,如果使用 gcc8.3.0,即使使用 -O2 也会抛出错误
那么发生了什么?如何解释呢?
如果不进行优化,order
对于内置编译器来说不可见为编译时常量,GCC 只是将运行时变量顺序视为seq_cst
(而不是对值进行分支以跳过mfence
(。 常量传播需要进行优化,以使非法order
对检查它的编译器逻辑可见,并给出预期的错误。
std::atomic<T>::store()
是一个用 C++ 编写的函数,它接受一个order
参数并将该变量传递给 GNU C 内置__atomic_store
。
如果没有优化,就不会发生常量传播。 为什么 clang 使用 -O0 产生低效的 asm(对于这个简单的浮点和(?. 即使__attribute__((always_inline))
也不会使编译器在内联时进行优化,它只是避免了实际的函数调用。 为什么这个C++包装类没有内联?
如果您查看生成的未优化的 asm,甚至还有一个非内联调用std::operator&(std::memory_order, std::__memory_order_modifier)
https://godbolt.org/z/dhViAG。 但是原子存储本身是内联的。
相关文章:
- 在reactor中存储eventHandlers的最佳方式是什么
- 具有相同特征的两个对象是否只在内存中存储一次?无论定义它们的函数是什么,都是不同的
- 存储变量的更有效方法是什么?
- 如果与memory_order_acquire一起存储会发生什么
- std::atomic_flag不提供加载或存储操作有什么缺点吗?(自旋锁定示例)
- 如果我在 C++ 中为 int 提供双精度,输入缓冲区中存储了什么?
- C++标准对局部变量的存储和分配有什么保证?
- 一个对象什么时候可以有非零大小的一个,但不能同时具有一个或多个字节的存储
- 在能够从 Web 浏览器访问大型数组数据的同时存储它的最可行方法是什么?
- 告诉编译器我希望变量始终存储在寄存器中的正确方法是什么
- 什么是在C 中存储结果INT*的最佳数据类型
- 存储具有许多变体的类的默认值的推荐方法是什么?
- 存储数据列表并自动分配给结构的最佳方法是什么
- 在未分配某些元素的数组中存储了什么值
- 如果未存储由功能返回的指针,会发生什么
- 访问和存储/解析性std :: Chrono ::持续时间:: milliseconds(cpprest)时使用什么类型
- C++ - 函数中的局部指针变量具有什么类型的存储持续时间以及它们存储在哪里?
- 通过无符号 char 别名进行对象访问,加载和存储时会发生什么?
- 在 boost::intrusive::unordered_set 的存储桶中使用了什么存储策略
- 什么存储类是函数内部的静态,以及为什么