编译器在这种情况下会做什么
What would the compiler do in this situation?
我想知道这个问题:
如果您的程序中有以下代码行,编译器将如何修改源代码以提高其效率?
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
相关文章:
- 在这种情况下,"typename..."意味着什么?
- 在这种情况下,int**在C中是什么意思
- 在这种情况下,括号有什么好处?
- 在这种情况下,#define 的作用是什么?
- 在这种情况下,我们可以使用静态而不是朋友吗,还有其他解决方案是什么
- 在这种情况下,删除指针数组期间会发生什么?
- 在这种情况下,有什么正确的方法可以实现锁定吗?
- 在这种情况下,* 有什么作用?:
- 在这种情况下,"使用"在做什么,正在存储什么?
- 在这种情况下,在"this"前面加上星号有什么作用?
- 在这种情况下,从左到右的结合性是什么意思
- 什么是错误C2039,在这种情况下它意味着什么
- 这个错误一般意味着什么?以及在这种情况下我如何解决它
- 编译器在这种情况下会做什么
- 在这种情况下,>=是什么意思
- 在这种情况下,溢出是什么意思
- 在这种情况下,为函数赋值有什么用
- 有人能向我解释一下在这种情况下发生了什么吗
- 在这种情况下,sizeof(int) 返回什么
- 警告C4309 -它是什么意思,在这种情况下可以忽略它