我知道当函数定义对于性能来说很小并且节省编译时间时,将内联函数(正常函数而不是类中的方法)声明为内联是一种很好的做法。但是如何在类中内联方法 我不理解类中内联方法的概念?如何定义它们以及它们如何工作。
答案 0 :(得分:54)
但是类中的内联方法怎么样?
内联函数的两种语法(使用显式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)
答案 1 :(得分:20)
在类中指定函数/过程为inline
,暗示编译器不是创建代码来调用函数并传递参数,而是将函数的内容放在调用点。< / p>
当在不必传递参数的情况下执行函数变得更有效时,它可以提高已编译二进制文件的性能。它也可能对性能造成损害,因为重复每个调用位置的函数中的代码会导致膨胀,从而减少代码在更快的高速缓存中找到的可能性。
答案 2 :(得分:18)
为编译器提供内联类函数有两种选择:
(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;
}