C ++模板和内联

当我正在编写一个简单的(非模板)类时,如果函数实现是“适当的”,它会被自动视为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; } 

在这里的第一个和第二个案例中会发生什么?

谢谢。

据我所知,模板函数是自动内联的。 然而,事实是大多数现代编译器经常忽略内联限定符。 编译器的优化启发式方法很可能会比select人类程序员更好地select内联函数。

因为当你实例化你得到一个类,该函数就像一个普通的成员函数。 它在该类中定义,所以该函数是自动内联的。

但在这里并不重要。 您可以在程序中多次定义函数模板或类模板的成员 – 您不需要inline来告诉编译器,就像在非模板的情况下一样。

inline关键字不是“规则”。 这只是对编译器的一个build议/暗示,它对它的作用完全取决于它并且是实现。 考虑到这一点,不可能知道你的例子会发生什么。 编译器实际上可以内联全部,部分或全部内联。