当我编写一个简单的(非模板)类时,如果“正确”提供了函数实现,它将自动视为inline
。
class A {
void InlinedFunction() { int a = 0; }
// ^^^^ the same as 'inline void InlinedFunction'
}
在谈论基于模板的类时,这个规则怎么样?
template <typename T> class B {
void DontKnowFunction() { T a = 0; }
// Will this function be treated as inline when the compiler
// instantiates the template?
};
此外,inline
规则如何应用于非嵌套模板函数,例如
template <typename T> void B::DontKnowFunction() { T a = 0; }
template <typename T> inline void B::DontKnowFunction() { T a = 0; }
第一种情况和第二种情况会发生什么?
谢谢。
答案 0 :(得分:13)
因为当你实例化你得到一个类时,该函数就像一个普通的成员函数。它在该类中定义,因此该函数自动内联。
但这并不重要。无论如何,您可以在程序中多次定义函数模板或类模板的成员 - 您不需要inline
在非模板情况下告诉编译器。
答案 1 :(得分:2)
据我所知,模板化函数是自动内联的。然而,实际情况是大多数现代编译器经常忽略内联限定符。编译器的优化启发式方法很可能在选择内联函数方面做得比人类程序员好得多。
答案 2 :(得分:1)
内联关键字不是“规则”。它只是对编译器的建议/提示,它对它的作用完全取决于它和它的实现。考虑到这一点,我们无法知道您的示例会发生什么。事实上,编译器可能内联所有,部分或全部内容。