优化:.cpp或.obj/.O或.lib/.a
Optimization: .cpp or .obj/.o or .lib/.a
我有这段代码,可以放在一个单独的库中,但我不确定这将如何影响编译器的优化能力。
选项1:将代码直接包含在项目中,并将其与其他所有内容一起编译。
选项2:构建.obj/。O文件,并在构建项目时使用它们。
选项3:创建一个静态库。. Lib或.a),并在构建项目时与之链接。
现在,我的问题是:哪一个会提供最好的性能?如果你能讨论/解释每个选项对编译器优化的影响,那就太棒了!
提前感谢:-)
性能应该没有差别:
一个.a
文件只是一个.o
文件的归档。链接器对它们的处理是一样的(除了.a
文件需要先解包)。
直接将所有源代码编译在一起,仍然会导致所有编译单元分别编译,然后链接在一起。只是编译器隐藏了这个,并在你背后调用链接器。然而,这种工作与首先分别编译编译单元,然后在显式步骤中将它们链接在一起时是一样的。
编译器所能做的优化没有区别。在任何情况下,对象都可以通过您想要的多少优化来构建。
您可能看到的唯一区别是当您构建共享库时。然后,当将对象或静态库直接链接到可执行文件时,您将有一个调用开销,这是您没有的。
如果通过选项1您的意思是通过头文件#include
代码,那么编译器可能能够比将多个对象链接在一起更好地优化,如选项2和3。这是因为编译器可以看到整个源代码,而不仅仅是目标代码,并且可能能够inline
函数。
选项2和选项3之间没有区别,因为存档文件*.a
只是目标文件*.o
的集合。
说了这么多,开放源码应用程序的架构:LLVM意味着你可以构建LLVM IR代码对象,当链接时可以适当地优化,包括内联函数。因此,如果您使用clang++
,这可能是一个选项。
相关文章:
- 如何指定我希望我的LIB链接到的DLL文件?-Visual Studio 2019
- JSON转换为nlohmann JSON-lib中的结构数组
- 为什么导入Mixed native/CLR lib.dll的本机C++应用程序没有在Mixed lib.dll中的外部变
- 如何在.obj文件上运行IlDasm?
- 使用 VS2015 在 Windows 10 上构建 Fortran .lib x64 位并将其链接到 C++
- 如何使用Qt 3D库加载和显示搅拌机.obj源文件场景
- 为什么我的链接器在找到Coin4d.lib后搜索Coin4sd.lib?
- libcpmtd.lib有什么用?
- 在 opengl 中渲染 obj 文件时出现黑窗口
- LNK1104:无法打开libpjproject-i386-Win32-vc14-Debug-Static.lib
- 解析引用 |exe/dll vs lib
- 可执行文件C++包括.obj,.lib和.dll吗?
- 无法打开输入文件 Poco.obj 或查找 PocoFoundationd.lib
- MSVS 2015构建DLL-在MSVCRTD.LIB(EXE_MAIN.OBJ)中的Indoke_main中未解决的外
- MSVCRTD.lib(crtexew.obj):错误LNK2019:未解析的外部符号_WinMain@16在函数___
- 错误 LNK1104: 无法打开文件 '...\...\PCL 1.6.0\3rdParty\Boost\lib.obj'
- Visual Studio输出.obj而不是.lib
- 优化:.cpp或.obj/.O或.lib/.a
- LNK1104无法打开文件'...lib.obj'
- Qt5静态构建无法打开输入文件"/SDK/lib/x86.obj"