C 绝对值编译器优化

C 绝对值编译器优化,c,gcc,optimization,C,Gcc,Optimization,我的问题是开放式的,答案可能太复杂,我无法理解,但如果你有一些高层评论,我将不胜感激 我写了一个简单的绝对值函数 我理解汇编代码将如何找到一个数字的绝对值,我所困惑的是编译器是如何得到这段代码的。具体来说,它消除了任何控制流。较旧版本的gcc会生成相同的代码吗?优化通常通过模式匹配算法实现。编译器编写者硬编码一组固定的模式,供优化器查找,并使编译器为其生成最佳代码 换句话说,编译器是硬编码的,可以在不同的上下文中识别这个特定的“如果否定就否定”模式,并为它生成这个无分支的机器代码 在实际的编译

我的问题是开放式的,答案可能太复杂,我无法理解,但如果你有一些高层评论,我将不胜感激

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


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

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

换句话说,编译器是硬编码的,可以在不同的上下文中识别这个特定的“如果否定就否定”模式,并为它生成这个无分支的机器代码


在实际的编译器中,模式不一定像“如果为负则否定”那样具体。它可能是某种更高层次的元模式,一旦代码中的特定细节被替换到其中,它就会简化为“如果否定就否定”。但是在任何情况下都会发生某种模式匹配。

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

换句话说,编译器是硬编码的,可以在不同的上下文中识别这个特定的“如果否定就否定”模式,并为它生成这个无分支的机器代码


在实际的编译器中,模式不一定像“如果为负则否定”那样具体。它可能是某种更高层次的元模式,一旦代码中的特定细节被替换到其中,它就会简化为“如果否定就否定”。但是在任何情况下都会发生某种模式匹配。

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

换句话说,编译器是硬编码的,可以在不同的上下文中识别这个特定的“如果否定就否定”模式,并为它生成这个无分支的机器代码


在实际的编译器中,模式不一定像“如果为负则否定”那样具体。它可能是某种更高层次的元模式,一旦代码中的特定细节被替换到其中,它就会简化为“如果否定就否定”。但是在任何情况下都会发生某种模式匹配。

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

换句话说,编译器是硬编码的,可以在不同的上下文中识别这个特定的“如果否定就否定”模式,并为它生成这个无分支的机器代码


在实际的编译器中,模式不一定像“如果为负则否定”那样具体。它可能是某种更高层次的元模式,一旦代码中的特定细节被替换到其中,它就会简化为“如果否定就否定”。但是在任何情况下都会发生某种模式匹配。

为什么不编译它呢@KerrekSB谢谢,这是一个很酷的资源。现代编译器比你更聪明:)它们不仅能识别你的代码做了什么,还能识别它真正应该做什么。阅读生成的程序集是了解您应该做什么的好方法:)为什么不编译它呢@KerrekSB谢谢,这是一个很酷的资源。现代编译器比你更聪明:)它们不仅能识别你的代码做了什么,还能识别它真正应该做什么。阅读生成的程序集是了解您应该做什么的好方法:)为什么不编译它呢@KerrekSB谢谢,这是一个很酷的资源。现代编译器比你更聪明:)它们不仅能识别你的代码做了什么,还能识别它真正应该做什么。阅读生成的程序集是了解您应该做什么的好方法:)为什么不编译它呢@KerrekSB谢谢,这是一个很酷的资源。现代编译器比你更聪明:)它们不仅能识别你的代码做了什么,还能识别它真正应该做什么。阅读生成的程序集是了解您应该做什么的一个很好的方法(有时:)
int absval(int val)
{
    return (val<0) ? -val: val;
}
movl    %edi, %edx
sarl    $31, %edx
movl    %edx, %eax
xorl    %edi, %eax
subl    %edx, %eax
ret