编译器在这种情况下会做什么

What would the compiler do in this situation?

本文关键字:什么 这种情况下 编译器      更新时间:2023-10-16

我想知道这个问题:

如果您的程序中有以下代码行,编译器将如何修改源代码以提高其效率?

int z = max(x,y);  // assume that x and y are of type int

给定这个函数:

inline int max (int a, int b)
{
  return (a > b) ? a : b;
}

不会。编译器不修改源代码;他们只是从源代码中生成目标代码。

假设max一开始是这样的:

int max(int a, int b) { 
    return b < a ? b : a; 
}

很有可能(至少在支持1的体系结构上),一个好的编译器会生成如下代码:

    mov eax, a
    mov ebx, b
    cmp eax, ebx
    jl  do_ret
    mov eax, ebx
do_ret:
    ret

就源代码而言,它与以下内容相对应:

int ret = a;
if (b < ret)
    ret = b;
return ret;

这样做的主要优点是它只需要if/then,而不需要if/then/else。后者通常需要至少一个额外的分支来分别执行两个分支,然后将执行流重新组合在一起。


1.在这种情况下,支持它非常容易。在少数情况下,您会遇到最容易进行比较的情况,然后加载一个值作为默认值,然后根据比较结果进行分支。这需要一个标志被而不是被负载修改的体系结构。例如,这在x86上是真的,但在其他许多平台上却不是(我想到了68K,尽管我已经很久不能相信我的记忆力了)。

这是一个微观优化,通常性能增益可以忽略不计。

取决于max()和目标汇编语言的声明。

如果max()定义为:

#define max(a,b) ((a) < (b) ? (a) : (b))

功能可以优化为:

z = b;
if (b < a)
{
  z = a;
}

如果你的处理器有条件指令,那么它可以优化为:

COMPARE A, B;
MOV Z,B IF A LT B
MOV Z,A IF B LT A