我想原子地在内联汇编中增加64位(C ++中的长类型)计数器。我知道如何在32位值(int)上执行此操作:
asm volatile("lock; incl %0" : "=m" (val) : "m"(val));
但我不知道如何在长期值上执行此操作。
答案 0 :(得分:0)
应该是:
asm volatile("lock; incq %0" : "+m" (val));
指定不带约束的单独操作数,强制输入与输出相同的位置可能会产生如下代码:
val = something;
asm volatile("lock; incq %0" : "=m" (val) : "m"(val));
错误地进行优化。您可能还需要一个内存clobber来防止访问其他变量通过asm移动。