在实现无锁数据结构和计时代码时,通常需要抑制编译器的优化。通常人们使用 asm volatile
和 memory
在清除列表中完成这项工作,但是有时您只看到 asm volatile
或者只看到一个简单的 asm
清除内存。
这些不同的语句对代码生成有什么影响(特别是在 GCC 中,因为它不太可能是可移植的) ?
仅供参考,下面是一些有趣的变化:
asm (""); // presumably this has no effect on code generation
asm volatile ("");
asm ("" ::: "memory");
asm volatile ("" ::: "memory");