GCC 生成的无用指令?

问题描述 投票:0回答:1

我用 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 永远不会插入它。

c gcc compilation
1个回答
0
投票

该函数不返回值,即使它说返回值。这是未定义的行为。在这种情况下,编译器可以自由地执行任何操作。包括以无意义的指示结束。

将返回类型更改为

void
将删除该指令。

保留返回类型但添加

return 0;
会在缺少的地方添加指令,作为将
eax
初始化为零的一种方式。

© www.soinside.com 2019 - 2024. All rights reserved.