我知道在函数定义很小且需要性能优化时,将函数声明为inline是一种好的做法,并且它会节省编译时间。但是如何处理类内的inline方法呢? 我不太理解类内的inline方法概念,如何定义它们以及它们是如何工作的。
我知道在函数定义很小且需要性能优化时,将函数声明为inline是一种好的做法,并且它会节省编译时间。但是如何处理类内的inline方法呢? 我不太理解类内的inline方法概念,如何定义它们以及它们是如何工作的。
但是在类内部定义的内联方法呢?
使用显式的inline
和在类定义内部定义成员函数的两种语法都只提供编译器有关内联的提示。从性能角度来看,它们是相等的。
对于在类声明中定义成员函数的情况,可读性应该是您最关心的问题:用多行实现细节污染类接口会让人很不舒服。因此,如果成员函数超过一个语句,请避免这样做:return stuff
或简单转发应该可以,但通常不要超过这个范围。
class MyClass
{
public:
int f() const { return m_i; }
int g() const;
private:
int m_i;
};
inline int MyClass::g() const
{
return m_i;
}
// both member-functions behave equally (except for naming)
g()
的代码所在的同一个“翻译单元”中。这有效地意味着定义应该包含在包含调用的源文件中。 - Alexander Poluektov在类内将函数/过程指定为 inline
,是向编译器暗示,代替创建调用函数并传递参数的代码,应该将函数内容放置在调用点。
这可以提高编译生成二进制代码的性能,因为执行函数而无需传递参数更加有效率。但也可能降低性能,因为在每个调用位置重复函数中的代码会导致臃肿,减少代码在更快缓存内存中的发现概率。
为了使一个类的函数成为内联函数,编译器提供了两个选项:
(1) 在类的声明中定义该函数(在头文件中)
class Human {
public:
Human(const char* name);
Human();
// is implicit inline
void lookAt(const char* name) const {
std::cout << "I'm looking at " << name << std::endl;
}
private:
char _name[30];
};
(2) 在函数定义中(在头文件中),显式使用inline关键字
// is explicit inline
inline void lookAt(const char* name) const {
std::cout << "I'm looking at " << name << std::endl;
}
inline
方法放在.cpp
文件中,它仍然必须放在头文件中。 - KayEss