创建一个自由的静态函数有什么优点吗?

Are there any advantages to making a free static function?

本文关键字:什么 静态函数 自由 一个 创建      更新时间:2023-10-16

我有一个.cpp文件,它有一些静态自由函数。我知道这将如何帮助头文件,但由于cpp不包括在任何地方,有什么意义?它有什么优点吗?

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

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

由于评论框太小,无法解释为什么你在推理中犯了严重错误,所以我把这个作为社区wiki的答案。对于头仅函数,static是非常无用的,因为任何人谁包括他们的头将得到一个不同的功能。这意味着您将复制编译器为每个函数创建的代码(除非链接器可以合并代码,但据我所知,这是非常不可能的),更糟糕的是,如果函数具有局部静态,那么每个局部都将是不同的,从而导致对来自不同包含的定义的每次调用可能进行多次初始化。不好的。

你需要的头函数是inline(非static inline),这意味着每个头包含将定义相同的函数和现代链接器能够不复制每个定义的代码,就像为static所做的那样(在许多情况下,c++标准甚至要求他们这样做),但是从所有包含创建的所有定义中只发出一个代码副本。

回复有点乱,因为第一个问题在我脑海中引起了一些大问题。

但是由于CPP不在任何地方

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

我有一个.cpp文件,其中有一些静态自由函数。我知道这将如何帮助在头文件…

这有什么用?

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

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