从 GCC 获取优化的源代码

Posted

技术标签:

【中文标题】从 GCC 获取优化的源代码【英文标题】:Get optimized source code from GCC 【发布时间】:2011-12-19 07:59:31 【问题描述】:

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

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

【问题讨论】:

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

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

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

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

【讨论】:

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

以上是关于从 GCC 获取优化的源代码的主要内容,如果未能解决你的问题,请参考以下文章

在gcc编译器中禁用特定优化(死代码消除)

有没有办法告诉 GCC 不要优化一段特定的代码?

GCC SSE 代码优化

为啥 GCC 不优化结构?

gcc/C++:如果 CPU 负载低,那么代码优化就没啥用了,对吗?

gcc 优化