我有一个.cpp
文件,它有一些静态自由函数。我知道这对头文件有什么帮助,但由于cpp没有包含在任何地方,重点是什么?这有什么好处吗?
答案 0 :(得分:39)
将自由函数声明为static
为它们提供内部链接,这允许编译器进行更积极的优化,因为现在可以保证TU之外的任何人都无法看到该函数。例如,函数可能完全从程序集中消失并在任何地方都被内联,因为不需要提供可链接的版本。
当然注意,这也稍微改变了语义,因为允许在不同的TU中使用相同名称的不同静态函数,而具有多个非静态函数的定义是错误的。
答案 1 :(得分:6)
由于评论框太小而无法解释您的推理中出现严重错误的原因,我将此作为社区维基回答。对于仅限标题的函数,static
几乎没用,因为包含其标题的任何人都将获得不同的函数。这意味着你将复制编译器为每个函数创建的代码(除非链接器可以合并代码,但据我所知,这是非常不可能的),更糟糕的是,如果函数具有本地静态,那么每个本地都会是不同的,导致每次调用来自不同包含的定义的潜在多次初始化。不好。
仅限标头功能所需的是inline
(非 - static
inline
),这意味着每个标头包含将定义相同的功能,现代链接器不能复制每个定义的代码就像为static
所做的那样(在很多情况下,C ++标准甚至要求他们这样做),但是只发出一个由所有包含文件创建的定义中的代码副本。
答案 2 :(得分:0)
有点无序响应,因为第一项解决了我脑子里的一些大问题。
但由于cpp不包含在任何地方
我强烈希望你永远不会#include
任何地方的源文件。预处理器不关心源与头之间的区别。这种区别主要是为了使人类受益,而不是编制者。您应该永远#include
源文件 的原因有很多。
我有一个.cpp文件,它有一些静态自由函数。我知道这对头文件有什么帮助...
这会有什么帮助?
如果这些自由函数具有外部链接,则在标头中声明非静态自由函数。在标头中声明(但不定义)静态自由函数没有帮助。这是一个障碍。您希望将内容放在标题中,以帮助您和其他程序员理解某些内容的导出内容。那些静态自由函数不是导出的内容。您可以在标题中定义自由函数,从而使它们成为导出的内容,但标准做法是使用inline
关键字而不是static
。
就源文件中的静态自由函数而言,您可能需要考虑将这些函数的声明放在源文件的顶部附近(但不在标题中)。这有助于提高可理解性。如果没有这些声明,源文件的组织将看起来像Pascalish,首先定义低级函数。大多数人喜欢自上而下的演示文稿。通过首先声明功能,您可以采用自上而下的策略。或者是一种由内而外的策略,或者任何策略使得功能最容易理解。