在这种情况下编译器会做什么? [已关闭]

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

我想知道这个问题:

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

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;
}
c++ optimization
2个回答
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。后者通常需要至少一个额外的分支来分别执行两条腿,然后将执行流程重新整合在一起。


1. 在这种情况下,支持它非常容易。在某些情况下,您会遇到这样一种情况:最简单的方法是进行比较,然后加载一个值作为默认值,然后根据比较结果进行分支。这需要一个标志“不”被负载修改的架构。例如,在 x86 上确实如此,但在其他许多平台上却并非如此(我想到了 68K,尽管我已经太久无法相信自己的记忆力了)。


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

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