【问题标题】:compiler optimization of absolute value绝对值的编译器优化
【发布时间】:2015-07-24 01:06:54
【问题描述】:

我的问题是开放式的,答案可能过于复杂,我无法理解,但如果您有一些高水平的 cmets,我将不胜感激!

我写了一个简单的绝对值函数

int absval(int val)
{
    return (val<0) ? -val: val;
}

然后用 gcc 的 -O 标志和 -S 选项编译它。 gcc 生成如下汇编代码

movl    %edi, %edx
sarl    $31, %edx
movl    %edx, %eax
xorl    %edi, %eax
subl    %edx, %eax
ret

我了解汇编代码如何找到数字的绝对值,但我很困惑的是编译器是如何得出这个代码的。具体来说,它消除了任何控制流。旧版本的 gcc 会生成相同的代码吗?

【问题讨论】:

  • 你为什么不直接编译它on an older compiler?!
  • @KerrekSB 谢谢,这是一个很酷的资源。
  • 现代编译器比你聪明 :) 它们不仅能识别你的代码做什么,还能识别它真正应该做什么。阅读生成的程序集是了解有时应该做什么的好方法:)

标签: c gcc optimization


【解决方案1】:

优化通常通过模式匹配算法实现。编译器编写者对一组固定的模式进行硬编码,以供优化器查找并使编译器为它们生成最佳代码。

换句话说,编译器经过硬编码,可以在各种上下文中识别这种特定的“负则否定”模式,并为其生成这种无分支机器代码。

在实际的编译器中,模式不一定像“负则否定”那样具体。一旦您的代码中的特定细节被替换到其中,它可能是一些更高级别的元模式,它会减少为“如果为负则否定”。但无论如何都会发生某种模式匹配。

【讨论】:

    猜你喜欢
    • 2011-11-07
    • 1970-01-01
    • 2020-04-14
    • 2014-02-21
    • 2011-08-24
    • 2012-02-12
    • 2011-12-29
    相关资源
    最近更新 更多