根据C ++规范,是否等效地定义了以下两个类?
class A
{
void f()
{
}
};
class B
{
inline void f()
{
}
};
即,将“内联”限定符放在类定义中定义的成员函数上是完全冗余的吗?
跟随问题:假设它是多余的,对于代码样式,保持“内联”标记是明智的,因此未来的开发人员意识到该函数应该内联,并且不会删除其他地方的定义并删除内联?
谢谢:)
答案 0 :(得分:86)
C ++ ISO标准说:
“类定义中定义的函数是内联函数。”
但是,这并不意味着函数必然会被内联:通常现在,编译器似乎会决定内联函数是否会带来任何好处。
答案 1 :(得分:19)
除了“一个定义规则”的目的之外,它们是等效的类定义。因此,该标准不保证您可以使用一个类定义和另一个TU编译一个TU(转换单元),然后将它们链接在一起。我怀疑这在真正的实现上实际上是否会失败,但这就是标准所说的。
inline
关键字与内联几乎没有任何关系。它是关于在不同的TU中是否允许多个相同的函数定义。如果有人将函数定义移到其他地方,那么他们应该决定是否在以下基础上标记它inline
:
如果它位于该类的.cpp
文件中,那么只有从该TU调用它才能将其标记为inline
。然后,它是否标记为inline
可能没有区别,但如果您认为编译器会关注您想要的内容,则可以将其标记为inline
作为编译器提示。
如果它仍在头文件中,则必须将其标记为inline
,否则在链接使用标题的不同TU时会出现多个定义错误。
假设移动函数的人知道这些事情,我认为他们不需要在类定义中提醒。如果他们不了解这些内容,那么他们可能没有任何业务移动功能,但他们使用inline
关键字移动它会更安全。
答案 2 :(得分:9)
将“内联”限定符放在类定义中定义的成员函数上是完全冗余的吗?
是
对于代码样式,保留“内联”标记是否明智,以便未来的开发人员意识到该函数应该内联,并且不会删除其他地方的定义并删除内联?
没有。
内联是针对“一个定义规则”(因此通过扩展链接)。如果函数定义为需要inline
并且未提供它,那么它是编译时错误。如果不需要那么它只是额外无用的绒毛。
因此,如果您不需要它,请将其删除。如果你需要把它放在那里(如果你忘了编译器会让你知道)。
答案 3 :(得分:2)
在这种情况下,内联是可选的,是的。编译器将知道它是内联的,并且只要包含头部,就不会生成函数的多个实例。
关于将它留在那里是否是一个好主意 - 我真的不这么认为。最好给出一个详细的评论来解释为什么函数必须内联(其中我只能解释两个原因:“它是一个模板”,在这种情况下,衬里是不可能的,或者“性能”在这种情况下我希望看到一些支持证据,而不是“它必须表现更好,因为它是内联的”,我在某些地方看到过。