(Linux)gcc进行优化编译的参数是啥?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了(Linux)gcc进行优化编译的参数是啥?相关的知识,希望对你有一定的参考价值。

优化编译的参数是:
-O [注意,是大写字母O,来自英文 Optimize]
-O1 [优化1,正常优化]
-O2 [优化2,优化程度高一级]
-O3 [优化3,优化程度最高]
不优化是 -O0

详细情况用:
man gcc
阅读 "OPTIMIZATION OPTIONS" 那部分
参考技术A 将file.c文件编译产生可执行文件myprog(-o选项),并且在编译的时候,生成调试信息(-g信息)。让gdb调试器可以调试该程序。
gcc是编译器程序名字
-o是可执行文件名字输出参数
-g是插入调试信息参数
当然是调试可执行文件myprog

从 GCC 获取优化的源代码

【中文标题】从 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】:

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

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

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

【讨论】:

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

以上是关于(Linux)gcc进行优化编译的参数是啥?的主要内容,如果未能解决你的问题,请参考以下文章

《编译 - 编译杂记》GCC优化等级说明

从 GCC 获取优化的源代码

在 GCC 4.1.1 中优化文件中单个函数的方法是啥?

GCC 可以使用编译时常量变量优化类的方法吗?

GCC优化技巧,真的有用吗?

GCC 11.1 进行 C++ 多项优化