我想知道这个问题:
如果您的程序中有以下代码行,编译器将如何修改您的源代码 - 以使其更高效?
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