我的问题已经结束了,答案可能太复杂了,我无法理解,但如果你有一些高级评论,我会非常感谢他们!
我写了一个简单的绝对值函数
int absval(int val)
{
return (val<0) ? -val: val;
}
然后用-O标志和-S选项用gcc编译它。 gcc生成以下汇编代码
movl %edi, %edx
sarl $31, %edx
movl %edx, %eax
xorl %edi, %eax
subl %edx, %eax
ret
我理解汇编代码如何找到数字的绝对值,我很困惑的是编译器如何得到这个代码。具体而言,它消除了任何控制流程。旧版本的gcc是否会生成相同的代码?
答案 0 :(得分:3)
优化通常通过模式匹配算法实现。编译器编写器硬编码一组固定的模式,供优化器查找并使编译器为它们生成最佳代码。
换句话说,编译器被硬编码以识别各种上下文中的这种特定的“否定否定”模式,并为其生成无分支机器代码。
在实际的编译器中,模式不一定像“否定的否定”一样具体。它可能是一些更高级别的元模式,一旦代码中的特定细节被替换为“负面”,就会减少“否定”。但无论如何都会发生某种模式匹配。