C++ 寻找关于静态函数和内联函数的澄清

C++ 寻找关于静态函数和内联函数的澄清,c++,static,inline,C++,Static,Inline,最初,我认为静态和内联对于函数意味着: 警告:这是我过去的想法,不要认为这是正确的 静态函数只存在一次。所有使用它的东西都使用相同的功能* 内联函数的内容可能被复制到调用函数中。编译器实际上可能会忽略这一点,但对于非模板头文件中的定义,它们是避免重复定义所必需的 作为一个静态内联函数,我还没有弄明白这意味着什么 *需要注意的是,类模板可以有效地生成类,因此对于每个派生类型,它们的静态内容完全不同 我从C++程序员的java程序员(Mark Allen Weiss,ISBN 03-11949

最初,我认为
静态
内联
对于函数意味着:


警告:这是我过去的想法,不要认为这是正确的


静态
函数只存在一次。所有使用它的东西都使用相同的功能*

内联
函数的内容可能被复制到调用函数中。编译器实际上可能会忽略这一点,但对于非模板头文件中的定义,它们是避免重复定义所必需的

作为一个
静态内联
函数,我还没有弄明白这意味着什么

*需要注意的是,类模板可以有效地生成类,因此对于每个派生类型,它们的静态内容完全不同


我从C++程序员的java程序员(Mark Allen Weiss,ISBN 03-1194924)获得了这个印象。第2.1.6段说:

在某些情况下,进行函数调用的开销可能很大。例如,max2例程非常简单,因此可能会尝试用max2在逻辑上执行的代码简单地替换main中的函数调用:。。。当然,这将牺牲良好的编程实践来提高速度

为了避免这种情况,可以使用inline指令。内联指令向编译器建议,它应该生成避免函数定义开销的代码

令人惊讶的是,我找不到关于
静态
函数的任何信息。它可能在那里,但我在索引中找不到它


但后来我发现,这似乎是完全相反的说法:

非静态内联函数声明引用使用它的每个翻译单元(源文件)中的相同函数

如果它是静态的,那么每个TU都有自己的函数版本,因此也有自己的静态局部变量副本


似乎对
inline
的含义持不同的立场,同意我最初的解释:

inline准确地表达了您想要的内容:“请抑制此函数的ODR规则,以便每个翻译单元可以(并且必须)提供其自己的函数定义副本”

但是接着说,
inline
函数可以是内联的(我假设这意味着复制到调用它的每个地方)或者合并在一起

然后,编译器将内联调用该函数,或者将来自不同TU的函数定义合并在一起(以便生成的函数在可执行文件中存在一次)

然后它还表示声明一个函数
static
意味着将存在任意数量的函数:

另一方面,static告诉编译器在定义它的每个翻译单元中生成函数,而不是共享它。因此,结果可执行文件中存在任意数量的技术上独立的函数


我不确定,但听起来好像
静态
函数存在不止一次,而
内联
函数,当编译器实际执行内联时,只存在一次。这与我过去的想法完全相反

但最重要的是,这里有一系列关于单例的问题,其中每个getInstance函数都声明为
static

<> P> >如果<代码>静态< /COD>函数可以不止一次地存在,这实际上意味着会有多个本地代码>静态< /COD>单体对象,并且我所见过的每个C++独联示例都是错误的,这似乎不太可能。
我再也不明白了。一切似乎都在暗示着别的东西。
静态
内联
,以及作为奖励:
静态内联
,对于函数来说真正意味着什么?

内联
很容易解释<代码>内联基本上是一种提示,提示编译器应该将给定函数复制(内联)到调用它的任何函数中,而不是执行普通的函数调用。对于简单的函数,这消除了函数调用开销

编译器不需要遵循
内联
:如果确定内联不值得额外的代码块(这可能导致缓存未命中并增加代码大小),它可以选择生成正常函数

inline
函数仅在声明它们的源文件中可用。因此,用于广泛重用的内联函数通常放在头文件中


static
在C++中有许多不同的用途:

  • static
    类方法或成员本质上属于该类,而不是该类的任何特定实例,如Java的
    static
    。这适用于静态方法和静态变量。请注意,静态类成员只有一个副本,即使您将声明放在共享头文件中;定义必须仅在一个文件中(除了
    静态常量
    成员)
  • 静态
    全局函数或变量只能由定义它的编译单元(源文件)访问。这样,它有点像内联函数,编译器可以选择内联静态函数。要共享的静态函数也放在头文件中
  • 函数中的
    静态
    局部变量是存在于该函数的所有调用中的变量,但只能在该函数中访问(与局部变量不同,局部变量是函数特定调用的专用变量)

您将文件范围的描述与程序范围的描述混淆了。当你说“不止一次”时,你是在含糊其辞。你需要说“不止一次”,C++是一种经济的智慧。