1

我有这段代码可以放在一个单独的库中,但我不确定这将如何影响编译器的优化能力。

选项 1:将代码直接包含在项目中并将其与其他所有内容一起编译。

选项 2:构建 .obj/.o 文件并在构建项目时简单地使用它们。

选项 3:创建一个静态库(.lib 或 .a)并在构建项目时与之链接。

现在,我的问题是:其中哪一个会提供最佳性能?如果您可以讨论/解释每个选项在编译器优化方面的后果,那将是非常棒的!

提前致谢 :-)

4

3 回答 3

2

性能上应该没有区别:

.a文件只是文件的存档.o。链接器对它们的处理方式相同(除了.a需要先解压缩文件)。

将所有源直接编译在一起仍然会导致所有编译单元单独编译,然后链接在一起。只是编译器隐藏了这个并在你背后调用链接器。尽管如此,工作与首先单独编译编译单元然后在显式步骤中将它们链接在一起时的工作相同。

于 2013-03-08T16:40:48.293 回答
1

编译器可以做的优化没有区别。在任何情况下,都可以使用您想要的优化来构建对象。

您可能会看到的唯一区别是构建共享库的时间。然后,在将对象或静态库直接链接到可执行文件时,您会产生调用开销,而您没有。

于 2013-03-08T16:41:09.950 回答
0

如果选项 1 是指#include通过头文件的代码,那么编译器可能会比将多个对象链接在一起稍好一些,如选项 2 和 3。这是因为编译器可以看到整个源代码,而不仅仅是目标代码,并可能能够发挥inline作用。

选项 2 和 3 之间没有区别,因为存档文件 - *.a- 只是目标文件的集合 - *.o.

综上所述,开源应用程序架构:LLVM意味着您可以构建 LLVM IR 代码对象,当链接时可以正确优化,包括函数的内联。因此,如果您正在使用clang++,这可能是一个选项。

于 2013-03-08T16:55:20.083 回答