是否可以中断表达式的计算
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++)
生成了 完全相同的代码 。无论如何,您可以详细说明一下您的问题吗?你太宽泛了,只要 x
和 y
在不同条目上不相同,此代码 是 可重入。否则,您应该向我们提供有关您打算的更多详细信息。
编辑:(显然,除非有一些隐藏的黑魔法...)不可能在 x86(-64) 架构上自动执行此类操作。无论如何,如果在一条指令中完成操作 "atomic" 是不可移植的。这是特定于 x86(-64) CPU 的。
考虑以下代码。
#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++)
生成了 完全相同的代码 。无论如何,您可以详细说明一下您的问题吗?你太宽泛了,只要 x
和 y
在不同条目上不相同,此代码 是 可重入。否则,您应该向我们提供有关您打算的更多详细信息。
编辑:(显然,除非有一些隐藏的黑魔法...)不可能在 x86(-64) 架构上自动执行此类操作。无论如何,如果在一条指令中完成操作 "atomic" 是不可移植的。这是特定于 x86(-64) CPU 的。