通过分析汇编列表来验证gcc / g ++中的编译器优化

我刚刚问了一个与编译器如何优化某些C ++代码有关的问题,并且我正在四处寻找有关如何验证编译器是否执行了某些优化的任何问题。 我试图看看使用g ++生成的汇编列表( g++ -c -g -O2 -Wa,-ahl=file.s file.c ),以便看到底下发生了什么,但输出太神秘了对我来说。 人们用什么技术来解决这个问题,并且有没有关于如何解释优化代码或特定于讨论这个问题的GCC工具链的文章的汇编清单的很好的参考?


GCC的优化以GIMPLE格式传递代码的中间表示。

使用-fdump-*选项系列,您可以要求GCC输出树的中间状态。

例如,将此提供给gcc -c -fdump-tree-all -O3

unsigned fib(unsigned n) {
    if (n < 2) return n;
    return fib(n - 2) + fib(n - 1);
}

并逐渐从简单的指数算法转换为复杂的多项式算法。 (真!)


一个有用的技术是在一个好的采样分析器下运行代码,例如在Mac OS X下的Linux或Instruments(带有Time Profiler工具)下的Zoom。这些分析器不仅向您显示代码中的热点,还将源代码映射到反汇编对象码。 突出显示源代码行显示映射到源代码行的生成代码(不一定是连续的)行(反之亦然)。 在线操作码参考和优化提示是一个不错的奖励。

  • 工具:developer.apple.com
  • 缩放:www.rotateright.com

  • 不是gcc,但在Visual Studio中进行调试时,您可以选择散布程序集和源代码,从而可以很好地了解为什么语句生成了什么内容。 但有时它不是很正确。

    gcc工具链和objdump -dS的输出不是相同的粒度。 这篇关于让gcc输出源代码和程序集的文章与您使用的选项相同。

    链接地址: http://www.djcxy.com/p/80741.html

    上一篇: Verifying compiler optimizations in gcc/g++ by analyzing assembly listings

    下一篇: Get Assembly code after every optimization GCC makes?