优化:.cpp或.obj/.O或.lib/.a

Optimization: .cpp or .obj/.o or .lib/.a

本文关键字:lib obj cpp 优化      更新时间:2023-10-16

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

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

选项2:构建.obj/。O文件,并在构建项目时使用它们。

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

现在,我的问题是:哪一个会提供最好的性能?如果你能讨论/解释每个选项对编译器优化的影响,那就太棒了!

提前感谢:-)

性能应该没有差别:

一个.a文件只是一个.o文件的归档。链接器对它们的处理是一样的(除了.a文件需要先解包)。

直接将所有源代码编译在一起,仍然会导致所有编译单元分别编译,然后链接在一起。只是编译器隐藏了这个,并在你背后调用链接器。然而,这种工作与首先分别编译编译单元,然后在显式步骤中将它们链接在一起时是一样的。

编译器所能做的优化没有区别。在任何情况下,对象都可以通过您想要的多少优化来构建。

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

如果通过选项1您的意思是通过头文件#include代码,那么编译器可能能够比将多个对象链接在一起更好地优化,如选项2和3。这是因为编译器可以看到整个源代码,而不仅仅是目标代码,并且可能能够inline函数。

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

说了这么多,开放源码应用程序的架构:LLVM意味着你可以构建LLVM IR代码对象,当链接时可以适当地优化,包括内联函数。因此,如果您使用clang++,这可能是一个选项。