最初,我认为static
和inline
意味着以下功能:
警告: 这是我以前的想法,不要认为这是正确的。
static
函数只存在一次。使用它的一切都使用相同的功能。*
可能会将inline
函数的内容复制到调用函数中。编译器实际上可能会忽略这一点,但如果在非模板头文件中定义,则必须避免重复定义。
static inline
功能,我仍然无法弄清楚这应该是什么意思。
*添加了注释,类模板有效地生成类,因此它们的静态内容对于每个派生类型都是完全不同的。
我从“C ++ for Java Programmers”(Mark Allen Weiss,ISBN 0-13-919424-X)中得到了这个印象。在第2.1.6段,它说:
在某些情况下,进行函数调用的开销可能很大。例如,max2例程是微不足道的,因此可能只想简单地用main2逻辑上执行的代码替换main中的函数调用:...当然,这将牺牲良好的编程实践来提高速度。
为避免这种情况,可以使用内联指令。内联指令建议编译器应该生成避免函数定义开销的代码......
令人惊讶的是,我无法找到有关static
功能的任何信息。它可能存在,但我无法在索引中找到它。
但后来我找到了this answer,这似乎完全相反:
非静态内联函数声明在使用它的每个翻译单元(源文件)中引用相同的函数。
和
如果它是静态的,那么每个TU都有自己的函数版本,因此它有自己的静态局部变量副本。
This answer似乎对inline
的含义采取了不同的立场,同意我原来的解释:
内联传达了您想要的内容:"请取消此功能的ODR规则,以便每个翻译单元都可以(并且必须)提供其自己的功能定义副本"。 / p>
然后继续说inline
函数可以内联(我认为这意味着重复到每个被调用的地方)或合并在一起。
然后,编译器将内联对函数的调用,或者将来自不同TU的函数定义合并在一起(以便生成的函数在可执行文件中存在一次)。
然后它还说声明函数static
意味着将存在任意数量的函数:
另一方面,static告诉编译器在定义它的每个转换单元中生成函数,而不是共享它。因此,您最终会在生成的可执行文件中存在任意数量的技术上独立的函数。
我不确定,但听起来static
函数不止一次存在,inline
函数,当编译器实际执行内联时,只存在一次。这与我过去常想的完全相反。
但最重要的是,这里有一系列关于单身人士的问题,其中每个getInstance函数都声明为static
:
因此,如果static
函数确实存在多次,这实际上意味着会有多个本地static
单例对象,并且我看到的每个C ++单例都是错误的,这似乎不太可能
我再也听不到了。一切似乎都暗示着别的东西。 static
,inline
以及奖励static inline
对于函数真正意味着什么?
答案 0 :(得分:9)
inline
很容易解释。 inline
基本上是对编译器的暗示,应该将给定函数复制(内联)到任何调用它的函数中,而不是进行正常的函数调用。对于简短的函数,这可以消除函数调用开销。
编译器不需要服从inline
:如果它确定内联不值得额外的代码批量(这可能导致缓存未命中并增加代码大小),它可以选择生成正常函数
inline
函数仅在声明它们的源文件中可用。因此,用于广泛重用的inline
函数通常放在头文件中。
static
在C ++中有许多不同的用途:
static
类方法或成员基本上属于类,而不是类的任何特定实例,如Java static
。这适用于静态方法和静态变量。请注意,即使您将声明放在共享头文件中,也只有一个静态类成员的副本;定义必须只在一个文件中(static const
成员除外)static
全局函数或变量只能由定义它的编译单元(源文件)访问。这样,它有点像内联函数,编译器可能会选择内联静态函数。要共享的静态函数也放在头文件中。static
局部变量是一个变量,它存在于该函数的所有调用中,但只能在该函数内部访问(与局部变量不同,局部变量对函数的特定调用是私有的)