我用 GCC 编译了这个简单的 C 代码:
int foo(int *a, int *b)
{
*a += 1;
*b += 1;
*a += 1;
}
int foo2(int *a, int *b)
{
*a += 1;
*b += 1;
*a += 1;
}
它会产生以下汇编代码:
foo:
add DWORD PTR [rdi], 1
add DWORD PTR [rsi], 1
add DWORD PTR [rdi], 1
ret
foo2:
add DWORD PTR [rdi], 1
xor eax, eax
add DWORD PTR [rsi], 1
add DWORD PTR [rdi], 1
ret
见神箭
这个
xor
指令的要点是什么?
在 C++ 中,GCC 不会插入它,而 clang 永远不会插入它。
该函数不返回值,即使它说返回值。这是未定义的行为。在这种情况下,编译器可以自由地执行任何操作。包括以无意义的指示结束。
将返回类型更改为
void
将删除该指令。
保留返回类型但添加
return 0;
会在缺少的地方添加指令,作为将 eax
初始化为零的一种方式。