内联方法:内部对外部类定义

时间:2015-03-09 10:21:52

标签: c++ inline

如果你有一个方法,并且你想给编译器一个提示内联它是一个好主意,你目前有两个解决方案。第一个是在声明类时定义方法:

class Vector {
private:
    double* data_;
    double* size_;
    double* capacity_;
public:
    double& operator[](int k) {
        return data_[k];
    }
    ...
}

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

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关键字在类外定义。该文件也以该类的注释声明开头。

所以我的问题如下。当前的编译器(我考虑GCCClang,Intel和Visual Studio)更有可能内联在类中声明的成员函数,而不是声明的成员函数。带有内联关键字的类?

备注:这个问题不是When should I write the keyword 'inline' for a function/method?的重复,因为我的问题是编译器实现。这两种方式表明你希望这些函数被内联是等价的。写STL的方式表明它们不是。

3 个答案:

答案 0 :(得分:13)

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

现在inline关键字的主要(仅限?)使用它允许在标头中定义函数而不会生成多个定义链接错误(这与内联无关)。

另请注意,内联发生在函数调用网站上,因此将某个函数设置为内联是没有意义的,因为它可能会在某些地方内联并且不在其他地方(取决于它周围的代码)。

我的建议:使用您认为更具可读性的内容,因为它对实际内联没有影响(除非您使用像__forceinline这样的编译器特定内容(不要这样做)。)

答案 1 :(得分:6)

  

当前的编译器(我在考虑gcc,clang,Intel,Visual Studio)是否更有可能内联在类中声明的成员函数,而不是使用inline关键字在类外声明的成员函数?

它完全没有任何区别。

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

答案 2 :(得分:1)

默认情况下,类定义中定义的方法为inline。在优化方面,选择一个或另一个对于编译器来说至多是一个小障碍 - 很可能无关紧要。