内联方法:类定义内部与外部类定义
Inline method: inside vs outside class definition
如果你有一个方法,并且你想给编译器一个提示,说明内联它是一个好主意,你目前有两种解决方案。第一个是在声明类时定义方法:
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
。在优化方面,选择一个或另一个对于编译器来说最多是小障碍 - 选择哪个很可能无关紧要。
- 具有外部"c"和程序集的未定义函数
- C++编程从外部文本文件定义数组大小
- 良好做法:如何定义用于编译的外部库的路径
- 使用外部定义的模板类型作为模板参数的更通用模板的模板别名
- 模板类外部的长定义的替代项
- 使用带有 CMake 和 Conan 的外部库的未定义引用
- 可视化C++外部定义内联函数
- 具有外部定义的默认特殊成员函数
- C++ 为什么在定义的编译和链接之前引用外部实例的程序
- 删除 PCL 可视化工具中定义的 3D 框外部的点
- 在成员函数外部封闭类的定义中需要默认成员初始值设定项
- 为什么在类外部(但在头文件中)定义的类成员函数必须内联?
- 如何在命名空间中声明外部全局,然后定义它?
- 使用静态变量未解析的外部符号/未定义的引用时出错
- 自定义对象构造函数在循环外部循环
- 我可以有一个从外部不可见但未在标头中定义的静态友元函数吗?
- 创建类时已定义的未解析外部符号
- 定义外部时未解析的外部符号"struct API Api"
- 为将来的'unset'变量定义外部变量是否是一种好的做法?
- 在同一头文件中定义外部变量