这是此问题的后续内容:Can the linker inline functions?
这次我想知道同样的优化,不是在链接时,而是在链接到动态库时的运行时。有可能吗?现代操作系统可以做到这一点吗?为什么?
最佳答案
理论上这是可能的,但有很多理由不这样做。实际上,“动态链接”并不是真正的完全链接;与位置无关的代码用于除主程序(也可能还有主程序)之外的所有代码,因此不需要完整(静态)链接器可能必须执行的全部重定位。相反,只需要少量的重定位类型,这基本上相当于将库中包含的函数和对象的地址填充到一个大的连续表中。当然,.data
段中静态存储持续时间的对象中的此类引用也必须填写,因此这比仅仅填写连续表要多一些工作,但关键是仅修改数据,而不修改代码。
如果您开始修改代码,您就会放弃动态链接的大部分优点:代码页无法在应用程序/库的多个实例之间共享,并且在启动复制时将花费更多时间(通过页面错误和写时复制语义)映射的代码页。这只是在代码中到处修补几个字节的最小成本。
对于从动态库中实际内联代码,您所要做的就是完全链接时优化。测量 LTO 链接一个大型程序需要多长时间,然后问问自己用户是否可以接受每次启动该程序时等待那么长时间。答案几乎肯定是否定的。
关于动态库中定义的小函数可以内联吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17073858/