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

Inline method: inside vs outside class definition

本文关键字:定义 外部 内部 方法      更新时间:2023-10-16

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

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 实现,我发现他们混合使用两者。一些方法(我认为应该真正内联的方法)是在类中定义的,而其他方法则是使用内联关键字在类外定义的。该文件还以类的注释声明开头。

所以我的问题如下。当前的编译器(我想到了GCC,Clang,Intel和Visual Studio)是否更有可能内联在类内声明的成员函数,而不是使用inline关键字在类外声明的成员函数?

备注:这个问题不是重复的 我什么时候应该为函数/方法写关键字"inline"?因为我的问题是关于编译器实现的。这两种表示您希望内联这些函数的方式是否等效。STL 的编写方式表明它们不是。

inline 关键字被认为是对编译器的提示,但是大多数编译器比程序员更擅长决定内联什么,因此他们通常忽略此提示

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

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

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

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

这绝对没有任何区别。

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

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