Inline method: inside vs outside class definition
如果您有一个方法,并且想给编译器提示内联它是一个好主意,则当前有两种解决方案。第一个是在声明类时定义方法:
1 2 3 4 5 6 7 8 9 10 11 | class Vector { private: double* data_; double* size_; double* capacity_; public: double& operator[](int k) { return data_[k]; } ... } |
由于此方法可能会降低可读性,因此另一个解决方案是使用
1 2 3 4 5 6 7 8 9 10 11 12 13 | class Vector { private: double* data_; double* size_; double* capacity_; public: inline double& operator[](int k); ... } double& Vector::operator[](int k) { return data_[k]; } |
这使代码更具可读性(至少我更喜欢)。阅读我的STL实现,我发现它们结合使用了两者。在类中定义了一些方法(我认为应该真正内联的那些方法),而其他方法是使用inline关键字在类外定义的。该文件还以该类的带注释的声明开始。
所以我的问题如下。与使用inline关键字在类外声明的成员函数相比,当前的编译器(我在考虑GCC,Clang,Intel和Visual Studio)是否更有可能内联在类内部声明的成员函数?
备注:此问题与"何时应为功能/方法编写内联关键字"不是重复的问题?因为我的问题是关于编译器的实现。用这两种方式表示希望内联这些功能是等效的。 STL的编写方式表明它们不是。
如今,
另外请注意,内联发生在函数调用站点上,因此说内联函数没有意义,因为它可能在某些地方而不是在其他地方内联(取决于周围的代码)。
我的建议:使用您认为更具可读性的内容,因为它不会对实际内联产生影响(除非您使用诸如
Do current compilers (I am thinking of gcc, clang, Intel, Visual Studio) are more likely to inline a member function that is declared inside the class than a member function declared out of class with the inline keyword?
它绝对没有任何区别。
正如其他人指出的那样,在现代编译器中,
默认情况下,在类定义中定义的方法为