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
:
我再也不明白了。一切似乎都在暗示着别的东西。
静态
,内联
,以及作为奖励:静态内联
,对于函数来说真正意味着什么?内联
很容易解释<代码>内联基本上是一种提示,提示编译器应该将给定函数复制(内联)到调用它的任何函数中,而不是执行普通的函数调用。对于简单的函数,这消除了函数调用开销
编译器不需要遵循内联
:如果确定内联不值得额外的代码块(这可能导致缓存未命中并增加代码大小),它可以选择生成正常函数
inline
函数仅在声明它们的源文件中可用。因此,用于广泛重用的内联函数通常放在头文件中
static
在C++中有许多不同的用途:
类方法或成员本质上属于该类,而不是该类的任何特定实例,如Java的static
。这适用于静态方法和静态变量。请注意,静态类成员只有一个副本,即使您将声明放在共享头文件中;定义必须仅在一个文件中(除了static
成员)静态常量
全局函数或变量只能由定义它的编译单元(源文件)访问。这样,它有点像内联函数,编译器可以选择内联静态函数。要共享的静态函数也放在头文件中静态
- 函数中的
局部变量是存在于该函数的所有调用中的变量,但只能在该函数中访问(与局部变量不同,局部变量是函数特定调用的专用变量)静态