制作自由静态功能有什么好处吗?

Luc*_*ore 16 c++

我有一个.cpp文件,它有一些静态免费功能.我知道这对头文件有什么帮助,但由于cpp没有包含在任何地方,重点是什么?这有什么好处吗?

Ker*_* SB 46

声明自由函数为static它们提供内部链接,这允许编译器进行更积极的优化,因为现在可以保证TU之外的任何人都不能看到该函数.例如,函数可能完全从程序集中消失并在任何地方内联,因为不需要提供可链接的版本.

当然注意,这也稍微改变了语义,因为允许在不同的TU中具有相同名称的不同静态函数,而具有多个非静态函数的定义是错误的.

  • "你可以在不同的TU中拥有不同的同名静态函数" - 无名的命名空间也可以提供这种效果,如果你喜欢花括号和额外的缩进;-) (3认同)
  • 是的,无名命名空间具有内部链接这一事实对于 C++11 来说是新的。 (2认同)

Joh*_*itb 6

由于评论框太小而无法解释为什么你的推理出现严重错误,我将其作为社区wiki答案.对于仅限标题的函数,static几乎没用,因为包含其标题的任何人都将获得不同的函数.这意味着你将复制编译器为每个函数创建的代码(除非链接器可以合并代码,但据我所知,这是非常不可能的),更糟糕的是,如果函数具有本地静态,那么每个本地都会是不同的,导致每次调用来自不同包含的定义的潜在多次初始化.不好.

对于仅头文件函数所需的是inline(非static inline),这意味着每个头文件包含将定义相同的函数,现代链接器不能复制每个定义的代码,如同static(对于许多情况,C++标准甚至需要)他们这样做),但只从所有包含的所有定义中发出一个代码副本.