"inline"隐式于类定义中定义的C++成员函数中



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

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

即,在类定义中定义的成员函数上放置"内联"限定符是否完全多余?

接下来的问题是:假设它是多余的,对于代码风格来说,保留"内联"标记是否明智,这样未来的开发人员就会意识到函数应该内联,而不是在其他地方删除定义并删除内联?

感谢:)

C++ISO标准规定:

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

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

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

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

  • 如果它在该类的.cpp文件中,那么如果它仅从该TU调用,则将其标记为inline是有效的。那么,它是否标记为inline可能没有什么区别,但如果您认为编译器会注意您想要的内容,则可以将其标记成inline作为编译器提示。

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

假设移动函数的人知道这些事情,我认为他们不需要在类定义中提醒。如果他们不知道这些事情,那么他们可能就没有必要移动函数,但对他们来说,有一个inline关键字来移动它会更安全

将"内联"限定符放在类定义中定义的此类成员函数上是否完全多余?

对于代码风格,保留"inline"标记是否明智,这样未来的开发人员就会意识到函数应该内联,而不是在其他地方删除定义并删除内联?

没有
内联用于"一个定义规则"(因此通过扩展进行链接)。如果函数是在需要inline的地方定义的,但没有提供,则是编译时错误。如果不需要它,那么它只是多余的无用绒毛。

所以,如果你不需要它,就把它删除。如果你需要它,把它放在那里(如果你忘记了编译器会让你知道的)。

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

至于把它留在那里是否是个好主意,我真的不这么认为。最好给出一个详细的注释来解释为什么函数必须内联(其中我可以忽略两个原因:要么是"它是一个模板",在这种情况下不可能内联,要么是"性能",在那种情况下我想看到一些支持证据,而不是我在某些地方看到的"它必须表现得更好,因为它是内联的"。

最新更新