在.obj文件中将符号标记为本地还是全局是否会影响链接性能



我正在努力寻找减少程序链接时间的方法。

我注意到我的代码库中有很多函数没有被指定为static,因此它们被视为extern

如果我将它们指定为static,它们将获得内部链接。我可以通过在对象文件上运行name mangling命令来验证这一点(在linux中nm(:

指定为static的函数具有局部符号(例如"t"(,而不是全局符号("t"(。

问:如果将足够多的符号(函数(从全局(外部(转换为本地(静态(,链接时间会显著缩短吗?

问:如果使用"Release"编译而不是"Debug"编译创建对象,我是否应该期待类似的结果?

Q:链接说明符(extern/static(对对象文件的大小有任何影响吗?

注意:这个问题是关于链接速度和对象文件大小的。这与函数隐式声明为extern的含义无关。

如果将足够多的符号(函数(从全局(外部(转换为本地(静态(,链接时间会显著缩短吗?

也许吧。当许多函数都是静态的时,链接器确实要做的工作更少——链接器构建的符号表会更小,在其中查找会更快。

这在实践中不太可能是可衡量的——你可能必须有数以万计的符号,并且你必须将其中90%转换为static,然后才能真正观察到加速。

如果对象是使用"Release"编译而不是"Debug"编译创建的,我应该期待类似的结果吗?

可能。在C++中,启用优化后,许多函数可能会被内联。这反过来又减少了链接器要做的工作。

链接说明符(extern/static(对对象文件?

UNIX系统传统上在.o中包含本地符号以进行调试,因此externstatic不会产生任何影响。

但您可以使用strip来删除不必要的(用于进一步链接(符号,然后具有static函数的.o将具有较小的符号表。

相关内容

最新更新