【问题标题】:Get optimized source code from GCC从 GCC 获取优化的源代码
【发布时间】:2026-01-27 14:30:01
【问题描述】:

我的任务是创建优化的 C++ 源代码并将其提供给朋友进行编译。也就是说,我不控制最终的编译,我只写C++程序的源代码。

我知道,a 可以在编译期间使用 GCC 的 -O1(以及 -O2 和其他)选项进行优化。但是我怎样才能得到这个优化的源代码而不是编译的程序呢?朋友编译器的参数我无法配置,所以我需要自己做一个好的源码。

【问题讨论】:

  • 虽然您可以编写“优化”的源代码,但要考虑诸如缓存和微调算法之类的事情(数学背景可能会有所帮助),如果您无法运行分析,则很难编写最佳代码在目标系统上找到您的瓶颈。

标签: c++ gcc optimization g++


【解决方案1】:

GCC 执行的优化是低级的,这意味着您不会再次获得 C++ 代码,而是最好的情况下获得汇编代码。但是您将无法转换它或其他东西。

总而言之:优化源代码在代码级别,而不是对象级别。

【讨论】:

    【解决方案2】:

    您可以要求 GCC 以各种方式转储内部(Gimple,...)representations “阶段”。 GCC的中端是由数百个pass组成的,你可以让GCC转储它们,arguments like -fdump-tree-all or -fdump-gimple-all;请注意,一次编译可以获得数百个转储文件!

    但是,GCC 的内部表示是相当低级的,你不应该期望不阅读大量材料就能理解它们。

    我提到的转储选项对于那些在 GCC 中工作的人来说非常有用,或者通过用 C 编码的 plugins 或用 MELT 编码的 extensions 来扩展它(高级域特定语言来扩展 GCC)。我不确定它们对您的朋友是否有用。但是,它们可以帮助您了解优化过程会进行很多复杂的处理。

    别忘了过早的优化是邪恶的:你应该首先让你的程序正确运行,然后对它进行基准测试和分析,最后优化你努力的几个部分。在将它们交给朋友之前,如果不亲自测试和运行它们,您可能无法编写正确且高效的程序。

    【讨论】:

      【解决方案3】:

      简单 - 选择可能的最佳算法,让优化器处理其余的。

      优化源代码与优化二进制文件不同。 优化源代码,编译器会优化二进制。

      除了算法选择之外,您还需要进行一些分析。当然,有些做法可以加快代码速度,但有些做法会降低代码的可读性。仅在必要时和测量后进行优化。

      【讨论】:

      • 这更像是“应该尝试优化算法编译器会尝试优化二进制"