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