我有这个代码可以放在一个单独的库中,但我不确定这将如何影响编译器的优化能力。
选项1:直接在项目中包含代码,并将其与其他所有内容一起编译。
选项2:构建.obj / .o文件,并在构建项目时使用它们。
选项3:创建静态库(.lib或.a)并在构建项目时与之链接。
现在,我的问题是:哪些会带来最佳表现?如果您可以讨论/解释每个选项对编译器优化的影响,那将是非常棒的!
提前致谢: - )
答案 0 :(得分:2)
性能应该没有区别:
.a
文件只是.o
个文件的存档。链接器对它们进行相同处理(除了需要首先解压缩.a
个文件)。
直接编译所有来源将仍然导致所有编译单元分别编译,然后链接在一起。只是编译器隐藏了它并在后面调用链接器。然而,这项工作与第一次单独编译编译单元然后在一个明确的步骤中将它们链接在一起时的工作相同。
答案 1 :(得分:1)
编译器可以做的优化没有区别。在每种情况下,都可以使用您想要的优化或更少的优化来构建对象。
您可能会看到的唯一区别是您构建共享库。然后,当将对象或静态库直接链接到可执行文件时,您有一个调用开销。
答案 2 :(得分:0)
如果选项1通过头文件表示#include
代码,那么编译器可能比将多个对象链接在一起稍微优化一样,如选项2和3中所示。这是因为编译器可以看到整个源代码,而不仅仅是目标代码,并且可以inline
函数。
选项2和3之间没有区别,因为存档文件 - *.a
- 只是对象文件的集合 - *.o
。
所有这一切,The Architecture of Open Source Applications: LLVM意味着您可以构建LLVM IR代码对象,这些对象在链接时可以正确优化,包括函数内联。因此,如果您使用clang++
,这可能是一种选择。