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

时间:2013-11-25 20:49:36

标签: c++ optimization compiler-construction

我想知道这个问题:

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

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;
}

2 个答案:

答案 0 :(得分:1)

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

假设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。后者通常需要至少一个额外的分支来分别执行两个分支,然后将执行流程重新组合在一起。


在这种情况下,支持它很容易。在少数情况下,您会遇到最容易进行比较的情况,然后加载一个值作为默认值,然后对比较结果进行分支。这需要一种架构,其中标志由负载修改。例如,这在x86上是正确的,但在许多其他情况下并不存在(68K会浮现在脑海中,尽管对我来说太长时间不相信我的记忆了。)

答案 1 :(得分:0)

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

取决于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