如果你有一个方法,并且你想给编译器一个提示内联它是一个好主意,你目前有两个解决方案。第一个是在声明类时定义方法:
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关键字在类外定义。该文件也以该类的注释声明开头。
所以我的问题如下。当前的编译器(我考虑GCC,Clang,Intel和Visual Studio)更有可能内联在类中声明的成员函数,而不是声明的成员函数。带有内联关键字的类?
备注:这个问题不是When should I write the keyword 'inline' for a function/method?的重复,因为我的问题是编译器实现。这两种方式表明你希望这些函数被内联是等价的。写STL的方式表明它们不是。
答案 0 :(得分:13)
inline
关键字被认为是编译器的提示,但是大多数编译器在决定内联函数方面要比程序员好得多,所以他们通常会忽略这个提示。
现在inline
关键字的主要(仅限?)使用它允许在标头中定义函数而不会生成多个定义链接错误(这与内联无关)。
另请注意,内联发生在函数调用网站上,因此将某个函数设置为内联是没有意义的,因为它可能会在某些地方内联并且不在其他地方(取决于它周围的代码)。
我的建议:使用您认为更具可读性的内容,因为它对实际内联没有影响(除非您使用像__forceinline
这样的编译器特定内容(不要这样做)。)
答案 1 :(得分:6)
当前的编译器(我在考虑gcc,clang,Intel,Visual Studio)是否更有可能内联在类中声明的成员函数,而不是使用inline关键字在类外声明的成员函数?
它完全没有任何区别。
正如其他人所指出的那样,在现代编译器中inline
只不过是一个连接修饰符。实际内联由优化标志,链接要求和特定于编译器的属性控制。
答案 2 :(得分:1)
默认情况下,类定义中定义的方法为inline
。在优化方面,选择一个或另一个对于编译器来说至多是一个小障碍 - 很可能无关紧要。