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