对于免费(非内部类)函数:
static
暗示inline
?inline
暗示static
?或两者兼而有之?
考虑一些例子:
static void foo1() { ... };
static inline void foo2 { ... };
inline void foo3() { ... };
有什么区别?
答案 0 :(得分:2)
存在差异,请考虑(在标题中):
static int foo1() { static int i = 0; return ++i; }
static inline int foo2() { static int i = 0; return ++i; }
inline int foo3() { static int i = 0; return ++i; }
和2 cpp“void caller[1-2]_foo[1-3]() { std::cout << foo[1-3]() << std::endl; }
”。
所以
int main()
{
caller1_foo1(); // 1
caller2_foo1(); // 1
caller1_foo2(); // 1
caller2_foo2(); // 1
caller1_foo3(); // 1
caller2_foo3(); // 2
}
我找不到static
和static inline
之间的差异。
答案 1 :(得分:0)
答案 2 :(得分:0)
(S)Static告诉编译器该代码仅用于此模块。你甚至可能得到一个&#34;未使用的&#34;如果您不使用它,请发出警告。
(I)Inline告诉编译器&#34;努力尝试&#34;内联代码。无论如何,它不是保证,但编译器有各种选项和编译指示来控制它。
如果编译器决定在此模块中内联它,那么每个人都很高兴。如果该方法也用于另一个(源)模块,那么该模块将自行决定该做什么。
(sI)如果编译器决定不内联非静态函数,那么它将作为独立函数存在。
(SI)&#39;静态&#39;有效果。如果它是静态的,则名称不会发送到链接器:另一个模块将生成具有相同名称的另一个函数,可能来自同一个源,也许不是。如果它不是静态的,则编译器将向链接器发出符号。如果另一个模块也决定不内联,那么它将被发出两次,并且链接器通过选择一个来处理它(看似随机地进行动态链接)!
(Si)使用静态复制可以改善代码局部性,其中非静态代码支付除1次调用之外的所有非局部性。然而,非本地化并不是一个大问题。这也适用于编译器决定不内联的内联标记方法。
(si)请注意,编译器决定内联的非静态非内联函数必须作为非内联函数发送到链接器以及内联代码,以防某些其他模块应该是extern它。如果未在外部引用(或导出)
,链接器可以丢弃此功能这有什么不同吗?可能不是!