我正在努力寻找减少程序链接时间的方法。
我注意到我的代码库中有很多函数没有被指定为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
中包含本地符号以进行调试,因此extern
与static
不会产生任何影响。
但您可以使用strip
来删除不必要的(用于进一步链接(符号,然后具有static
函数的.o
将具有较小的符号表。