提问人:Luchian Grigore 提问时间:9/30/2011 最后编辑:Luchian Grigore 更新时间:9/30/2011 访问量:13551
制作一个自由的静态函数有什么好处吗?
Are there any advantages to making a free static function?
答:
将自由函数声明为 会给它们提供内部链接,这允许编译器进行更积极的优化,因为现在可以保证 TU 之外的任何人都看不到该函数。例如,该函数可能会从程序集中完全消失,并在所有位置内联,因为不需要提供可链接的版本。static
当然,请注意,这也略微改变了语义,因为允许在不同的 TU 中拥有同名的不同静态函数,而对非静态函数进行多个定义是错误的。
评论
inline
由于评论框太小,无法解释为什么你的推理有严重的错误,我把这个作为社区维基的答案。对于仅标头函数,几乎毫无用处,因为任何包含其标头的人都将获得不同的函数。这意味着您将复制编译器为每个函数创建的代码(除非链接器可以合并代码,但据我所知,这不太可能),更糟糕的是,如果函数具有局部静态,则每个局部变量都将不同,从而导致每次调用来自不同包含的定义时都可能进行多次初始化。不好。static
仅标头函数需要的是 (non- ),这意味着每个标头包含将定义相同的函数,并且现代链接器能够不像 done for 那样复制每个定义的代码(在许多情况下,C++ 标准甚至要求它们这样做),而是从所有包含创建的所有定义中只发出一个代码副本。inline
static
inline
static
评论
inline
inline
static
inline
static
static
inline
static
.text
static inline
inline
有点不合时宜的响应,因为解决的第一个项目在我的脑海中引发了一些巨大的问题。
但是由于 CPP 不包括在任何地方
我强烈希望你永远不要在任何地方出现源文件。预处理器不关心源与标头之间的区别。这种区别的存在很大程度上是为了造福人类,而不是造福于编译者。有很多原因,你不应该在任何地方使用源文件。#include
#include
我有一个 .cpp 文件,其中包含一些静态免费功能。我知道这对头文件有什么帮助......
那会有什么帮助?
如果非静态自由函数具有外部链接,则在标头中声明这些自由函数。在标头中声明(但不定义)静态自由函数无济于事。这是一个障碍。你想把东西放在一个标题中,帮助你和其他程序员理解某些东西的导出内容。这些静态自由函数不是导出的内容。您可以在标头中定义自由函数,从而使它们成为导出的内容,但标准做法是使用 关键字而不是 .inline
static
就源文件中的静态自由函数而言,您可能需要考虑将这些函数的声明放在源文件顶部附近(但不要放在标头中)。这有助于提高可理解性。如果没有这些声明,源文件的组织将看起来是 Pascalish,首先定义低级函数。大多数人喜欢自上而下的演示。通过首先声明函数,您可以采用自上而下的策略。或者由内而外的策略,或者任何使功能最容易理解的策略。
评论