C++ 创建自由静态函数有什么好处吗?

C++ 创建自由静态函数有什么好处吗?,c++,C++,我有一个.cpp文件,它有一些静态自由函数。我知道这在头文件中会有什么帮助,但既然cpp没有包含在任何地方,那又有什么意义呢?它有什么好处吗?将自由函数声明为静态会给它们提供内部链接,从而允许编译器进行更积极的优化,因为现在可以保证TU之外的任何人都看不到该函数。例如,函数可能会从程序集中完全消失,并在任何地方都内联,因为不需要提供可链接的版本 当然,请注意,这也会稍微改变语义,因为您可以在不同的TU中使用相同名称的不同静态函数,而使用多个非静态函数定义是错误的。由于注释框太小,无法解释您在推理

我有一个
.cpp
文件,它有一些静态自由函数。我知道这在头文件中会有什么帮助,但既然cpp没有包含在任何地方,那又有什么意义呢?它有什么好处吗?

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


当然,请注意,这也会稍微改变语义,因为您可以在不同的TU中使用相同名称的不同静态函数,而使用多个非静态函数定义是错误的。

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


只包含标题的函数需要
内联
(非
静态
内联
),这意味着每个标题包含将定义相同的函数,并且现代链接器能够不复制每个定义的代码,就像
静态
(对于很多情况下,C++标准甚至要求它们这样做),但只在所有包含的所有定义中只发出一个代码副本。

< P>有点无序响应,因为第一个项目在我脑海中提出了一些巨大的问题。

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

我强烈希望您永远不要在任何地方包含源文件。预处理器不关心源文件和头文件之间的区别。这种区别主要是为了造福于人类,而不是编译器。有很多原因使您永远不要在任何地方包含源文件

我有一个.cpp文件,它有一些无静态的函数。我知道这在头文件中会有什么帮助

那会有什么帮助

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


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

你能更清楚地问这个问题吗?你不明白哪一部分?还有,为什么否决票?否决票不是我提出的。至于你的第一个问题:读你原来的帖子,试着理解它。你似乎失去了一些字符……有不同的b吗?是的,有。b。对……一定是删除了其他部分这个问题搞错了。现在我记不起我还想问什么了:DThx,我希望得到的一种答案。“你可以在不同的TUs中拥有相同名称的不同静态函数”-如果你喜欢花括号和额外的缩进,无名名称空间也可以提供这种效果;-)@SteveJessop:没错(我们不缩进名称空间:-),但这是在C++11中添加的吗?我的意思是内部链接。是的,无名名称空间具有内部链接这一事实对C++11来说是新的。编译器肯定可以完成所有这些吗?在现代编译器中,
inline
关键字基本上被忽略了——“Clang将其视为程序员的温和建议”,因此它不会改变内联,链接器可以删除未使用的函数。我认为您夸大了使函数
inline
防止代码重复的程度。将其标记为
inline
不会阻止编译器实际将其内联,因此如果不是prolog等,也会复制代码的重要部分。但它确实避免了大型
静态
函数可能被复制的情况,即使是在给定自由支配权的情况下,编译器会选择不内联。@Steve我不是说内联函数调用。标准C++中没有关键字可以防止内联调用函数,无论是代码< >内联函数还是<代码>静态< /代码>函数。这是编译器的事,它将按照自己的意愿内联调用
静态
内联
函数。您说过,“现代链接器不会复制每个定义的代码”。考虑到内联的存在,我认为这种说法具有误导性。更准确的可能是,“现代链接器能够不复制代码”。@Steve关于误导因素,你是对的。然而,该标准甚至要求链接器在您获取