静态库性能 - 可以内联调用吗?

时间:2013-05-05 13:06:41

标签: c++ static-libraries

我一直在尝试制作游戏引擎,我开始创建数学基础(Vector,Matrix和Point类)。 我想创建一个静态库文件(.lib),然后我可以在我需要的其他游戏引擎中使用它。

我想知道的是以下内容。由于库中的大多数功能都需要尽可能快。我想看看函数,例如内联的Vector类。编译器可以自动执行此操作吗?或者是否需要某种提示?

我知道我可以将所有源代码放在头文件中,但我认为这不是一个优雅的解决方案,因为某些函数可能太大而无法内联。 (对于使用它们的人来说,头文件不会有点混乱。)

我希望你们能帮助我。

基督教

2 个答案:

答案 0 :(得分:1)

如果compileunit具有源代码的可见性,则只保证函数内联可以使用当前的编译器技术。将代码编译到库中后,无论函数是什么,它都不会内联函数。

有一些“整个程序优化”方案(至少在MSVC和GCC中可用,也可能是其他编译器),它们产生的“目标文件”只是机器代码的一部分,因此有些有关“源代码所需内容”的信息可用于最终代码生成/链接阶段以移动代码,执行内联等,但这仅适用于所有源文件在编译时可用的情况。一旦某些东西被制成最终目标代码(你的静态库是),它就不会进入“内联”部分。

显然,如果你有类,它们将在头文件中,所以如果你把适合内联的函数放到头文件中,编译器就会做正确的事情。

答案 1 :(得分:1)

是的,您可以使用链接时优化来执行此操作。如果你生成一个"脂肪"库,它既包括已编译的源,也包括可用于在链接时内联函数的中间形式(实质上,在链接时完成最终编译步骤,其中一切都可见)。

这项技术有点脆弱,因为您需要确保在编译和链接时使用相同的标志,还有一些其他限制:它不是公开分发库的好方法。如果它适用于受控的内部使用,它可能会很好用。