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