创建一个自由的静态函数有什么优点吗?
Are there any advantages to making a free static function?
我有一个.cpp
文件,它有一些静态自由函数。我知道这将如何帮助头文件,但由于cpp不包括在任何地方,有什么意义?它有什么优点吗?
将自由函数声明为static
使它们具有内部链接,这允许编译器进行更积极的优化,因为现在可以保证TU之外的任何人都无法看到该函数。例如,函数可能完全从程序集中消失,并在所有地方被内联,因为不需要提供可链接的版本。
当然,这也稍微改变了语义,因为您可以在不同的tu中使用相同名称的不同静态函数,而拥有非静态函数的多个定义是错误的。
由于评论框太小,无法解释为什么你在推理中犯了严重错误,所以我把这个作为社区wiki的答案。对于头仅函数,static
是非常无用的,因为任何人谁包括他们的头将得到一个不同的功能。这意味着您将复制编译器为每个函数创建的代码(除非链接器可以合并代码,但据我所知,这是非常不可能的),更糟糕的是,如果函数具有局部静态,那么每个局部都将是不同的,从而导致对来自不同包含的定义的每次调用可能进行多次初始化。不好的。
你需要的头函数是inline
(非static
inline
),这意味着每个头包含将定义相同的函数和现代链接器能够不复制每个定义的代码,就像为static
所做的那样(在许多情况下,c++标准甚至要求他们这样做),但是从所有包含创建的所有定义中只发出一个代码副本。
回复有点乱,因为第一个问题在我脑海中引起了一些大问题。
但是由于CPP不在任何地方
我强烈希望你永远不要在任何地方#include
源文件。预处理器并不关心源文件和头文件之间的区别。这种区别的存在主要是为了造福人类,而不是编译器。你不应该在任何地方#include
源文件的原因有很多。
我有一个.cpp文件,其中有一些静态自由函数。我知道这将如何帮助在头文件…
这有什么用?
在头文件中声明非静态的自由函数,如果这些自由函数有外部链接。在头文件中声明(但不定义)静态自由函数没有帮助。这是一种障碍。您希望在头文件中添加一些内容,以帮助您和其他程序员理解导出的内容。这些与静态无关的函数不是导出的内容。您可以在头文件中定义自由函数,从而使它们成为导出内容,但标准做法是使用inline
关键字而不是static
。
对于源文件中的静态自由函数,您可能需要考虑将这些函数的声明放在源文件的顶部附近(但不要放在头文件中)。这有助于提高可理解性。如果没有这些声明,源文件的组织将看起来像Pascalish,首先定义底层函数。大多数人喜欢自上而下的演示。通过首先声明函数,您可以采用自顶向下的策略。或者一个由内到外的策略,或者任何让功能最容易理解的策略。
- 给定一个C++嵌套的私有结构类型,是否有从文件范围静态函数访问它的策略
- 检查编译时是否存在静态函数
- 名称隐藏对静态函数继承的实例使用
- 如果 C 函数仍然可以间接执行(通过回调函数),那么将它声明为静态函数是否是一种不好的做法?
- 类中静态函数C++意外结果
- 在工人类中使用不同类的静态函数进行实验
- 类 Referention 中C++回调函数引用非静态函数
- 指向模板上下文中的成员函数或静态函数的指针
- 如何检测 Clang AST C++中的静态函数
- 内联asm编译器屏障(内存阻塞器)是算作外部函数,还是算作静态函数调用
- 如何在静态函数中使用成员函数数组
- (2 问题)"类"类型重新定义(即使 #pragma 一次),以及静态函数内的静态成员对象初始化?
- 生成代码(在编译时)以调用模板的每个实例化的静态函数
- C++无法访问或使用静态函数
- 如何将 cpp 文件中的静态函数公开给其他文件
- 在静态函数中返回对象而不是构建对象的优点是什么?
- 静态函数到类的静态指针之间的区别是什么
- 在匿名命名空间内部和外部定义静态函数有什么区别吗?
- 未定义的引用静态函数指针成员在c++,我做错了什么
- 创建一个自由的静态函数有什么优点吗?