例子:
$ objdump Logger.cpp.o -t
00000000 g F .text 00000000 .hidden __sti___10_Logger_cpp_0b2ae32b
一个解释gcc可见性支持的链接
来自链接:
它可以极大地提高DSO(动态共享对象)的加载速度。例如,经过测试的一个巨大的基于C++模板的库(TnFOX Boost.Python绑定库),现在加载时间只需要8秒,而不是原来的6分钟以上!
它可以让优化器生成更好的代码。PLT间接寻址(当必须通过全局偏移表查找函数调用或变量访问时,如PIC代码)可以完全避免,从而大大减少现代处理器上的流水线停顿,从而实现更快的代码。此外,当大多数符号都是本地绑定时,它们可以完全安全地省略(删除)整个DSO中的符号。这为内联程序提供了更大的自由度,因为它不再需要保留一个入口点“以防万一”。
它可以将您的DSO大小减少5-20%。 ELF导出的符号表格式占用了相当大的空间,给出了完整的混淆符号名称,使用大量模板的情况下平均约为1000字节。 C ++模板会产生大量符号,一个典型的C ++库很容易超过30,000个符号,约为5-6Mb!因此,如果削减掉60-80%的不必要符号,您的DSO可以小几兆字节!
符号冲突的可能性大大降低。这个补丁终于解决了两个库在内部使用相同符号表示不同事物的老问题。哈利路亚!
虽然上述库是一个极端案例,但新的可见性支持将导出符号表从> 200,000个符号减少到不到18,000个。二进制文件大小也减小了约21Mb!
在使用可见性属性时,使用示例和潜在陷阱。