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

Ins*_*oop 19 c++ inline

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

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

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

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

double& Vector::operator[](int k) {
    return data_[k];
}
Run Code Online (Sandbox Code Playgroud)

这使得代码更具可读性(至少我更喜欢它).阅读我的STL实现,我发现他们使用了两者的混合.一些方法(我认为应该真正内联的方法)在类中定义,而其他方法则使用inline关键字在类外定义.该文件也以该类的注释声明开头.

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

备注:这个问题与我何时应该为函数/方法编写关键字'inline'不重复我的问题是关于编译器实现.这两种方式表明你希望这些函数被内联是等价的.STL的编写方式表明它们不是.

Mot*_*tti 13

inline关键字被视为提示编译器,但大多数编译器是在决定什么比程序员内嵌所以他们通常忽略这更好的暗示.

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

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

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

  • 模板方法需要在使用/实例化时可见,这意味着将它们放在某个地方的标题中.因此,选择只是在您的类中定义一个字面内联方法,或者提供一个`inline`声明并稍后定义它(但仍然在标题中).这是一种风格选择,与您关于在呼叫站点内联的可能性的问题无关. (2认同)

And*_*own 6

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

它完全没有任何区别.

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


Luc*_*ore 1

默认情况下,类定义中定义的方法inline。在优化方面,选择其中一个至多只是编译器的一个小障碍——您选择哪一个很可能并不重要。