出于显而易见的原因,C 编译器必须编译对其他共享库外部可见的所有函数,以便它们符合平台的调用约定和其他 ABI 要求。但是,我了解到,对于可以保证永远不会从外部模块调用的函数,不一定需要这样做。
编译器如何以及何时可以确定对于给定函数是否成立?
静态函数仅对同一编译单元中的其他函数可见,因此将是此类破坏 ABI 优化的良好候选者。但是指向静态函数的函数指针仍然可以传递给其他模块。编译器是否尝试确定函数指针是否在代码中的任何位置传递?
gcc 编译器有一些扩展,允许将符号声明为默认、隐藏甚至是内部的,并且文档特别提到,这些信息可用于执行某些外部可见功能无法实现的优化。如果将函数指针传递给注释为内部函数的外部代码会发生什么?
帮助编译器执行尽可能多的优化,同时仍保证与其他库的互操作性的最佳方法是什么?我是否应该只使用编译器选项将所有函数定义为内部函数,并使用所有需要在外部可见的函数的属性覆盖它?