我发现in Linux kernel, the clflush
function已实现为
asm volatile("clflush %0" : "+m" (*(volatile char __force *)__p));
我不太明白为什么在这里使用+ m?
根据我的理解,不应该将其实现为
asm volatile ("clflush (%0)" :: "r"(p));
答案 0 :(得分:2)
这两种形式的指令都有效,因为它们都指的是同一个地址。但是,通过使用+m
作为约束,它确保使用代码完成的任何优化(因为函数是内联的)不会假定保存在指针__p
中的数据。换句话说,它可以防止无效优化。