从https://gcc.gnu.org/onlinedocs/gcc-8.1.0/gcc/Optimize-Options.html#index-fsemantic-interposition:
-fsemantic-interposition
某些目标文件格式,如ELF,允许动态链接器通过交叉引用符号来进行重定位。这意味着对于从DSO导出的符号,编译器无法执行过程间传播、内联和其他优化,因为涉及到的函数或变量可能会发生更改。虽然此功能非常有用,例如通过调试实现重写内存分配函数,但在代码质量方面是昂贵的。通过-fno-semantic-interposition,编译器假定如果函数被交叉引用,则覆盖函数将具有完全相同的语义(和副作用)。类似地,如果变量被交叉引用,则变量的构造函数也将是相同的。该标志对于显式声明为内联的函数(其中永远不允许交叉引用改变语义)和显式声明为弱的符号没有影响。
从https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#index-visibility-function-attribute: protected protected可见性类似于默认可见性,但它表示定义模块内的引用与该模块中的定义绑定。也就是说,声明的实体不能被另一个模块覆盖。
这听起来完全一样。
除了将任何显式标记为default的函数更改为protected之外,是否有任何真正的区别?
-fsemantic-interposition
某些目标文件格式,如ELF,允许动态链接器通过交叉引用符号来进行重定位。这意味着对于从DSO导出的符号,编译器无法执行过程间传播、内联和其他优化,因为涉及到的函数或变量可能会发生更改。虽然此功能非常有用,例如通过调试实现重写内存分配函数,但在代码质量方面是昂贵的。通过-fno-semantic-interposition,编译器假定如果函数被交叉引用,则覆盖函数将具有完全相同的语义(和副作用)。类似地,如果变量被交叉引用,则变量的构造函数也将是相同的。该标志对于显式声明为内联的函数(其中永远不允许交叉引用改变语义)和显式声明为弱的符号没有影响。
从https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#index-visibility-function-attribute: protected protected可见性类似于默认可见性,但它表示定义模块内的引用与该模块中的定义绑定。也就是说,声明的实体不能被另一个模块覆盖。
这听起来完全一样。
除了将任何显式标记为default的函数更改为protected之外,是否有任何真正的区别?
-fvisibility=hidden
并注释了函数的可见性(有关更多详细信息,请参见此处),那么语义层面的插入确实没有太大用处。 - yugrprotected
可见性,因为它会减慢运行时链接速度(请参见Ian Lance Taylor的这篇优秀文章)。 - yugr