C++模板和内联

Yip*_*Yay 37 c++ templates inline-method

当我编写一个简单的(非模板)类时,如果函数实现是"正确"提供的,它会自动被视为inline.

class A {
   void InlinedFunction() { int a = 0; }
   // ^^^^ the same as 'inline void InlinedFunction'
}
Run Code Online (Sandbox Code Playgroud)

在谈论基于模板的类时,这条规则怎么样?

template <typename T> class B {
   void DontKnowFunction() { T a = 0; }
   // Will this function be treated as inline when the compiler
   // instantiates the template?
};
Run Code Online (Sandbox Code Playgroud)

此外,该inline规则如何应用于非嵌套模板函数,例如

template <typename T> void B::DontKnowFunction() { T a = 0; }

template <typename T> inline void B::DontKnowFunction() { T a = 0; }
Run Code Online (Sandbox Code Playgroud)

第一种情况和第二种情况会发生什么?

谢谢.

Joh*_*itb 13

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

但这并不重要.无论如何,您可以在程序中多次定义函数模板或类模板的成员 - 您不需要inline像在非模板情况下那样告诉编译器.


Pup*_*ppy 0

据我所知,模板化函数是自动内联的。然而,现实情况是大多数现代编译器经常忽略内联限定符。编译器的优化启发式很可能比人类程序员在选择内联函数方面做得更好。

  • inline 是一个非常具体且明确的含义。但它与“代码内联”关系不大,并且大多数现代编译器都忽略它为“代码内联”提供的“提示”。它的链接和其他内容是不容忽视的。 (24认同)
  • 编译器不允许忽略“内联”限定符,而且我不知道有任何现代编译器会这样做。“inline”对函数的多个定义的语言规则进行了特定的明确定义的更改。这不仅仅是一个提示。 (23认同)
  • @mazhaka 当然:第 6.4 节第 72 页。“这可能会导致函数模板默认是内联的。但是,它们不是。如果您编写应作为内联函数处理的函数模板,则应该使用内联说明符(除非该函数已经是内联的,因为它是在类定义中定义的) (7认同)
  • Charles,编译器可以忽略内联限定符。http://www.parashift.com/c++-faq-lite/inline-functions.html#faq-9.1 (6认同)
  • 根据 [C++ 模板完整指南] (http://www.amazon.com/Templates-Complete-Guide-David-Vandevoorde/dp/0201734842),您必须将函数声明为内联 (3认同)