关于C ++:内联方法:内部类与外部类的定义

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];
    }
    ...
}

由于此方法可能会降低可读性,因此另一个解决方案是使用inline关键字并在类外定义该方法:

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的编写方式表明它们不是。


inline关键字被认为是编译器的提示,但是大多数编译器在决定内联内容方面比程序员要好得多,因此他们通常会忽略此提示。

如今,inline关键字的主要用法(仅用于?)可用于在标头中定义函数,而不会产生多个定义链接错误(与内联实际上无关)。

另外请注意,内联发生在函数调用站点上,因此说内联函数没有意义,因为它可能在某些地方而不是在其他地方内联(取决于周围的代码)。

我的建议:使用您认为更具可读性的内容,因为它不会对实际内联产生影响(除非您使用诸如__forceinline之类的特定于编译器的东西(不要这样做))。


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?

它绝对没有任何区别。

正如其他人指出的那样,在现代编译器中,inline仅仅是链接修饰符。实际内联由优化标志,链接要求和特定于编译器的属性控制。


默认情况下,在类定义中定义的方法为inline。在进行优化时,选择一个或另一个最多是编译器的一个小障碍-选择哪种最可能无关紧要。