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

时间:2011-09-30 12:54:55

标签: c++

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

3 个答案:

答案 0 :(得分:39)

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

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

答案 1 :(得分:6)

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

仅限标头功能所需的是inline(非 - static inline),这意味着每个标头包含将定义相同的功能,现代链接器不能复制每个定义的代码就像为static所做的那样(在很多情况下,C ++标准甚至要求他们这样做),但是只发出一个由所有包含文件创建的定义中的代码副本。

答案 2 :(得分:0)

有点无序响应,因为第一项解决了我脑子里的一些大问题。

  

但由于cpp不包含在任何地方

我强烈希望你永远不会#include任何地方的源文件。预处理器不关心源与头之间的区别。这种区别主要是为了使人类受益,而不是编制者。您应该永远#include源文件 的原因有很多。

  

我有一个.cpp文件,它有一些静态自由函数。我知道这对头文件有什么帮助...

这会有什么帮助?

如果这些自由函数具有外部链接,则在标头中声明非静态自由函数。在标头中声明(但不定义)静态自由函数没有帮助。这是一个障碍。您希望将内容放在标题中,以帮助您和其他程序员理解某些内容的导出内容。那些静态自由函数不是导出的内容。您可以在标题中定义自由函数,从而使它们成为导出的内容,但标准做法是使用inline关键字而不是static

就源文件中的静态自由函数而言,您可能需要考虑将这些函数的声明放在源文件的顶部附近(但不在标题中)。这有助于提高可理解性。如果没有这些声明,源文件的组织将看起来像Pascalish,首先定义低级函数。大多数人喜欢自上而下的演示文稿。通过首先声明功能,您可以采用自上而下的策略。或者是一种由内而外的策略,或者任何策略使得功能最容易理解。