29

我刚开始在 Linux 上使用 g++ 编译器,并在编译器标志上遇到了一些问题。这是他们

优化

我在 g++ 手册页中阅读了有关优化标志-O1的信息。我不明白何时使用这些标志。通常你使用什么优化级别?g++ 手册对.-O2-O3-O2

进一步优化。GCC 执行几乎所有支持的优化,不涉及空间速度折衷。当您指定 -O2 时,编译器不会执行循环展开或函数内联。与 -O 相比,此选项增加了编译时间和生成代码的性能。

如果它不进行内联和循环展开,如何实现上述性能,是否推荐使用此选项?

静态库

如何使用 g++ 创建静态库?在 Visual Studio 中,我可以选择一个类库项目,它将被编译成“lib”文件。g ++中的等价物是什么?

4

5 回答 5

40

经验法则:

当你需要调试时,使用 -O0 (和 -g 来生成调试符号。)

准备发货时,请使用 -O2。

当你使用 gentoo 时,使用 -O3 ...!

当您需要将其放在嵌入式系统上时,请使用 -Os(针对大小进行优化,而不是针对效率进行优化。)

于 2009-04-28T05:14:38.337 回答
6

gcc 手册列出了每个优化级别的所有隐含选项。在 O2,您可以获得诸如常量折叠、分支预测和 co 之类的东西,它们可以显着改变应用程序的速度,具体取决于您的代码。确切的选项取决于版本,但它们的文档非常详细。

要构建静态库,请按如下方式使用 ar:

ar rc libfoo.a foo.o foo2.o ....
ranlib libfoo.a

Ranlib 并不总是必要的,但没有理由不使用它。

于 2009-04-28T13:43:52.293 回答
4

关于何时使用什么优化选项 - 没有一个正确的答案。

某些优化级别有时可能会降低性能。这取决于您正在编写的代码类型和它具有的执行模式,并且取决于您正在运行的特定 CPU。

(举一个简单的规范示例 - 编译器可能决定使用使您的代码比以前稍大的优化。这可能会导致代码的某个部分不再适合指令缓存,此时更多的访问内存将是必需的 - 例如在一个循环中)。

最好根据您的需要进行测量和优化。尝试、衡量和决定。

一条重要的经验法则 - 对代码执行的优化越多,使用调试器(或读取其反汇编)调试它的难度就越大,因为 C/C++ 源代码视图离生成的二进制文件更远。出于这个原因,在开发/调试时使用较少的优化是一个很好的经验法则。

于 2009-04-28T05:06:42.583 回答
2

除了循环展开和内联之外,编译器可以执行许多优化。那里特别提到了循环展开和内联,因为尽管它们使代码更快,但它们也使代码更大。

要制作静态库,请使用“g++ -c”生成 .o 文件并使用“ar”将它们归档到库中。

于 2009-04-28T04:10:00.210 回答
0

关于静态库问题,David Cournapeau给出的答案是正确的,但您也可以将 's' 标志与 'ar' 一起使用,而不是在静态库文件上运行 ranlib。“ ar”手册页指出

在存档上运行 ar 相当于在其上运行 ranlib。

无论您使用哪种方法都只是个人喜好问题。

于 2016-01-22T10:02:51.397 回答