Ker*_* SB 46
声明自由函数为static它们提供内部链接,这允许编译器进行更积极的优化,因为现在可以保证TU之外的任何人都不能看到该函数.例如,函数可能完全从程序集中消失并在任何地方内联,因为不需要提供可链接的版本.
当然注意,这也稍微改变了语义,因为允许在不同的TU中具有相同名称的不同静态函数,而具有多个非静态函数的定义是错误的.
由于评论框太小而无法解释为什么你的推理出现严重错误,我将其作为社区wiki答案.对于仅限标题的函数,static几乎没用,因为包含其标题的任何人都将获得不同的函数.这意味着你将复制编译器为每个函数创建的代码(除非链接器可以合并代码,但据我所知,这是非常不可能的),更糟糕的是,如果函数具有本地静态,那么每个本地都会是不同的,导致每次调用来自不同包含的定义的潜在多次初始化.不好.
对于仅头文件函数所需的是inline(非static inline),这意味着每个头文件包含将定义相同的函数,现代链接器不能复制每个定义的代码,如同static(对于许多情况,C++标准甚至需要)他们这样做),但只从所有包含的所有定义中发出一个代码副本.