【发布时间】:2012-06-04 06:02:53
【问题描述】:
使用inline 关键字有两个含义(第 7.1.3/4 节):
- 它提示编译器在调用点替换函数体优于通常的函数调用机制。
- 即使省略了内联替换,也会遵循内联的其他规则(尤其是 w.r.t 一个定义规则)。
如果需要,通常任何主流编译器都会在调用点替换函数体,因此实际上不需要将函数 inline 标记为 #1。
进一步 w.r.t #2,据我了解,当您将函数声明为 static inline 函数时,
函数上的static 关键字强制inline 函数具有内部链接(内联函数具有外部链接)此类函数的每个实例都被视为单独的函数(每个函数的地址不同)并且这些函数的每个实例都有自己的静态局部变量和字符串文本的副本(内联函数只有一个副本)
因此,这样的函数就像任何其他 static 函数一样,关键字 inline 不再重要,它变得多余。
所以,实际上标记函数static 和inline 都没有任何用处。它应该是static(不是最喜欢)或inline(最喜欢),
那么,在函数上同时使用static 和inline 是否实际上 没用?
【问题讨论】:
-
sn-p“以及这些函数的每个实例都有自己的静态局部变量和字符串文字的副本”来自哪里?
-
标准是这样说的吗>>如果需要的话,通常任何主流编译器都会在调用点替换函数体,所以仅仅为#1标记函数内联并不是真正需要的。我>
-
@JonasByström: § 7.1.3/4 "如果一个具有*外部链接的函数被声明为内联一个翻译单元,它应在其出现的所有翻译单元中声明为内联;不需要诊断。内联函数带有外部链接应在所有翻译单元中具有相同的地址翻译单元。extern inline 函数中的静态局部变量始终引用同一个对象。extern inline 函数是不同翻译单元中的同一个对象*”。标记为
static的函数没有外部链接,因此反向应用。 -
@Nawaz:不,这不是标准所说的(我无处声称它确实如此),我是这么说的,它基于大多数主流编译器的行为。通常这个标准不会说任何关于实现它只谈论可观察的行为这个Q是关于实用性的。
-
为了清楚起见,我想补充一下,这个问题是关于
staticinline不是类方法的函数。对于staticinline方法,请查看here。