我正在设法减少我的程序的链接时间。
我注意到,我的代码库中有许多函数没有被指定为static,因此它们被视为extern。
如果我将它们指定为static,它们将得到内部链接。我可以通过在对象文件(linux中的nm)上运行name-mangling命令来验证这一点:
指定为static的函数有一个本地符号(例如't'),而不是全局符号('T')。
Q:,如果足够多的符号(函数)从全局(外部)转换为局部(静态),那么链接时间会显著减少吗?
Q:如果对象是使用“发布”编译而不是“调试”编译创建的,那么应该期待类似的结果吗?
Q:链接说明符(extern/static)对对象文件的大小有影响吗?
注意:这个问题是关于链接速度和对象文件大小。这与将函数隐式声明为extern的含义无关。
发布于 2022-09-24 22:45:37
,如果足够多的符号(函数)从全局(外部)转换为局部(静态),那么链接时间会显著减少吗?
也许吧。当很多函数都是静态的时,链接器的工作量就会减少--链接器构建的符号表将会更小,在它们中的查找速度也会更快。
在实践中,这不太可能是可测量的--你可能需要有数万个符号,而且你必须将其中90%的符号转换成static,然后你才能真正观察加速。
如果对象是使用“发布”编译而不是“调试”编译创建的,那么
应该期待类似的结果吗?
有可能。在C++中,随着优化的进行,许多函数可能会内联。这反过来又为链接器留下了更少的工作。
链接说明符(extern/静态)对对象文件的大小有任何影响吗?
UNIX系统传统上在.o中包含用于调试的本地符号,因此extern与static没有任何影响。
但是您可以使用strip删除不必要的符号(用于进一步链接),然后带有static函数的.o将有更小的符号表。
https://stackoverflow.com/questions/73796939
复制相似问题