在“类定义”中定义的C ++成员函数中隐式“内联”

时间:2012-02-08 11:04:34

标签: c++ class inline

根据C ++规范,是否等效地定义了以下两个类?

class A
{
   void f()
   {
   }
};

class B
{
   inline void f()
   {
   }
};

即,将“内联”限定符放在类定义中定义的成员函数上是完全冗余的吗?

跟随问题:假设它是多余的,对于代码样式,保持“内联”标记是明智的,因此未来的开发人员意识到该函数应该内联,并且不会删除其他地方的定义并删除内联?

谢谢:)

4 个答案:

答案 0 :(得分:86)

C ++ ISO标准说:

“类定义中定义的函数是内联函数。”

但是,这并不意味着函数必然会被内联:通常现在,编译器似乎会决定内联函数是否会带来任何好处。

答案 1 :(得分:19)

除了“一个定义规则”的目的之外,它们是等效的类定义。因此,该标准不保证您可以使用一个类定义和另一个TU编译一个TU(转换单元),然后将它们链接在一起。我怀疑这在真正的实现上实际上是否会失败,但这就是标准所说的。

inline关键字与内联几乎没有任何关系。它是关于在不同的TU中是否允许多个相同的函数定义。如果有人将函数定义移到其他地方,那么他们应该决定是否在以下基础上标记它inline

  • 如果它位于该类的.cpp文件中,那么只有从该TU调用它才能将其标记为inline。然后,它是否标记为inline可能没有区别,但如果您认为编译器会关注您想要的内容,则可以将其标记为inline作为编译器提示。

  • 如果它仍在头文件中,则必须将其标记为inline,否则在链接使用标题的不同TU时会出现多个定义错误。

假设移动函数的人知道这些事情,我认为他们不需要在类定义中提醒。如果他们不了解这些内容,那么他​​们可能没有任何业务移动功能,但他们使用inline关键字移动它会更安全。

答案 2 :(得分:9)

  

将“内联”限定符放在类定义中定义的成员函数上是完全冗余的吗?

  

对于代码样式,保留“内联”标记是否明智,以便未来的开发人员意识到该函数应该内联,并且不会删除其他地方的定义并删除内联?

没有。
内联是针对“一个定义规则”(因此通过扩展链接)。如果函数定义为需要inline并且未提供它,那么它是编译时错误。如果不需要那么它只是额外无用的绒毛。

因此,如果您不需要它,请将其删除。如果你需要把它放在那里(如果你忘了编译器会让你知道)。

答案 3 :(得分:2)

在这种情况下,内联是可选的,是的。编译器将知道它是内联的,并且只要包含头部,就不会生成函数的多个实例。

关于将它留在那里是否是一个好主意 - 我真的不这么认为。最好给出一个详细的评论来解释为什么函数必须内联(其中我只能解释两个原因:“它是一个模板”,在这种情况下,衬里是不可能的,或者“性能”在这种情况下我希望看到一些支持证据,而不是“它必须表现更好,因为它是内联的”,我在某些地方看到过。