是否可以中断表达式的计算

Is it possible to interrupt evaluation of an expression

考虑以下代码。

#‎include‬ <stdio.h>

void f(int *x, int *y)
{
    (*x)++;
    (*y)++;
}

int main()
{
    int x=5, y=5;

    f(&x, &y);

return 0;
}

我知道函数f是不可重入的。我在想的一件愚蠢的事情是在一行中执行 (*x)++ + (*y)++ 并丢弃总和。我想知道是否会生成多个汇编指令来评估此表达式。是否会在表达式求值之间提供中断?

你不会得到任何原子...

c.o:     file format elf64-x86-64


Disassembly of section .text:

0000000000000000 <f>:
   0:   55                      push   %rbp
   1:   48 89 e5                mov    %rsp,%rbp
   4:   48 89 7d f8             mov    %rdi,-0x8(%rbp)
   8:   48 89 75 f0             mov    %rsi,-0x10(%rbp)
   c:   48 8b 45 f8             mov    -0x8(%rbp),%rax
   10:  8b 00                   mov    (%rax),%eax
   12:  8d 50 01                lea    0x1(%rax),%edx
   15:  48 8b 45 f8             mov    -0x8(%rbp),%rax
   19:  89 10                   mov    %edx,(%rax)
   1b:  48 8b 45 f0             mov    -0x10(%rbp),%rax
   1f:  8b 00                   mov    (%rax),%eax
   21:  8d 50 01                lea    0x1(%rax),%edx
   24:  48 8b 45 f0             mov    -0x10(%rbp),%rax
   28:  89 10                   mov    %edx,(%rax)
   2a:  5d                      pop    %rbp
   2b:  c3                      retq

使用 -O2 会好很多,但它仍然不是原子的。

c.o:     file format elf64-x86-64


Disassembly of section .text:

0000000000000000 <f>:
   0:   83 07 01                addl   [=11=]x1,(%rdi)
   3:   83 06 01                addl   [=11=]x1,(%rsi)
   6:   c3                      retq

并且,至少对于 GCC,为 (*x)++ + (*y++) 生成了 完全相同的代码 。无论如何,您可以详细说明一下您的问题吗?你太宽泛了,只要 xy 在不同条目上不相同,此代码 可重入。否则,您应该向我们提供有关您打算的更多详细信息。

编辑:(显然,除非有一些隐藏的黑魔法...)不可能在 x86(-64) 架构上自动执行此类操作。无论如何,如果在一条指令中完成操作 "atomic" 是不可移植的。这是特定于 x86(-64) CPU 的。