2013-06-12 46 views
2

这是一个后续行动这样一个问题:Can the linker inline functions?动态库中定义的小函数是否可以内联?

这一次,我想知道差不多的优化,而不是在链接时,但在运行时链接到一个动态库时。它有可能吗?现代操作系统做到了吗?为什么?

+1

如果库提供者打算将小函数内联,他们可以在库附带的头文件中提供这些函数的定义。 – jxh

+1

请注意,只有在库函数操作的数据结构是公共API的一部分时,才应使用建议的方法@jxh。如果不是这样,这些内联函数将把库的数据结构的非公开API知识包含在针对库构建的应用程序中,并且如果未来版本的库想要对这些非公共结构进行任何更改,应用程序将严重破坏如果与新版本的库一起使用。这可以通过库版本管理来处理,但是随后您会强制用户保留旧版本的库... –

回答

4

理论上这是可能的,但有很多理由不这样做。在实践中,“动态链接”并不是完全链接的;除了主程序(也可能是主程序)之外的所有其他位置都使用与位置无关的代码,因此不需要全部(静态)链接程序可能必须执行的全部重定位。相反,只需要少量的重定位类型,这些重定位类型基本上相当于填充大型连续表中库中包含的函数和对象的地址。当然,这些在.data段中的静态存储持续时间的对象中的引用也必须填入,所以它的工作量要比填充连续表的要多一点,但关键点是只有数据而不是代码被修改。

如果您开始修改代码,则会抛弃动态链接的大部分优点:代码页无法在应用程序/库的多个实例中共享,并且在启动时会花费更多时间进行复制(通过页面错误和写时复制语义)映射的代码页。这仅仅是在代码中修补几个字节的最小代价。

对于从动态库实际内联代码,你必须做的事情将相当于完整的链接时间优化。测量LTO链接大型程序需要多少时间,然后问问自己,如果用户在每次启动程序时等待这么长时间,是否可以接受。答案几乎肯定不是。

+0

感谢您提供非常干净和翔实的答案! –

相关问题