寻找有关静态和内联函数的说明

时间:2014-06-11 18:59:59

标签: c++ static inline

最初,我认为staticinline意味着以下功能:


警告: 这是我以前的想法,不要认为这是正确的。


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 ++单例都是错误的,这似乎不太可能

我再也听不到了。一切似乎都暗示着别的东西。 staticinline以及奖励static inline对于函数真正意味着什么?

1 个答案:

答案 0 :(得分:9)

inline很容易解释。 inline基本上是对编译器的暗示,应该将给定函数复制(内联)到任何调用它的函数中,而不是进行正常的函数调用。对于简短的函数,这可以消除函数调用开销。

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

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


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

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