最初,我认为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功能的信息.它可能在那里,但我在索引中找不到它.
但后来我找到了这个答案,似乎正好相反:
非静态内联函数声明在使用它的每个转换单元(源文件)中引用相同的函数.
和
如果它是静态的,则每个TU都有自己的函数版本,因此它有自己的静态局部变量副本.
这个答案似乎采取了不同的立场inline,同意我原来的解释:
inline准确传达了你想要的东西:"请为这个函数抑制ODR规则,这样每个翻译单元都可以(并且必须)提供它自己的函数定义副本".
但后来继续说一个inline函数可以内联(我假设这意味着重复到它被调用的每个地方)或合并在一起.
然后,编译器将内联对函数的调用,或者将来自不同TU的函数定义合并在一起(以便生成的函数在可执行文件中存在一次).
然后它还说声明一个函数static意味着将存在任意数量的函数:
另一方面,static告诉编译器在定义它的每个转换单元中生成函数,而不是共享它.因此,您最终会在生成的可执行文件中存在任意数量的技术上独立的函数.
我不确定,但它听起来像static函数不止一次存在并且inline函数,当编译器实际执行内联时,只存在一次.这与我以前的想法完全相反.
但最重要的是,这里有一堆关于单身人士的问题,其中声明了每个getInstance函数static:
因此,如果static函数确实存在多次,这实际上意味着将存在多个本地static单例对象,并且我看到的每个C++单例示例都是错误的,这似乎不太可能.
我不再理解了.一切似乎都暗示着别的东西.是什么static,inline以及,作为奖励:static inline真的意味着功能?
inline很容易解释.inline基本上是对编译器的一个提示,即应该将给定函数复制(内联)到任何调用它的函数中,而不是进行正常的函数调用.对于简短的函数,这可以消除函数调用开销.
编译器不需要遵守inline:如果它确定内联不值得额外的代码批量(这可能导致缓存未命中并增加代码大小),它可以选择生成正常函数.
inline函数仅在声明它们的源文件中可用.因此,inline用于广泛重用的功能通常放在头文件中.
static 在C++中有许多不同的用途:
static类方法或成员基本上属于类而不是类,像Java的的任何特定实例static.这适用于静态方法和静态变量.请注意,即使您将声明放在共享头文件中,也只有一个静态类成员的副本; 定义必须只在一个文件中(static const成员除外)static全局函数或变量是仅在其中它被定义的编译单元(源文件)进行访问.这样,它有点像内联函数,编译器可能会选择内联静态函数.要共享的静态函数也放在头文件中.static函数内部局部变量是跨职能的所有调用存在的变量,但它仅仅是内部的功能来访问(不像局部变量,它们是私有函数的某个调用).| 归档时间: |
|
| 查看次数: |
1143 次 |
| 最近记录: |