1.内联函数的由来
当我们调用函数的时候,实际会有额外的开销,为了避免或减少这些额外的开销,c++中引入内联函数(inline functions)。
2.内联函数的原理
1)当我们调用内联函数时,不会像调用普通函数那样额外开销,而是把内联函数的代码直接嵌入到调用它的地方去,但仍然保持其独立性。
2)如果一个函数为内联函数,它就不会出现在最终的可执行代码里,只是会存在于编译器中,在编译器需要的地方插入。
3.内联函数的写法
在一般函数前面加上inline的关键字,在头文件里定义而非声明。
4.内联函数的优点
1)以牺牲代码的空间换时间,提高了效率。
2)与c语言的宏的思想类似,但要优于宏,因为宏不能做类型检查,而内联函数作为一个函数可以进行类型检查。
5.被自动默认的内联函数
1)在class声明中定义了成员函数,这些函数都是内联的。
2)如果我们为了使类看起来直观,在class中声明了成员函数,也可在class下方定义,将成员函数变为内联函数:
class a
{
private:
int i;
public:
a();
void f1();
};
inline a::a()
{
...
}
inline void a::f1()
{
...
}
6.使用内联函数与否的情况
建议使用的情况:
1)函数代码本身较短,系统可能默认处理其为内联函数
2)频繁被调用的,处于循环中的函数
不能使用的情况:
1)过于巨大的函数,编译器可能拒绝该函数作为内联函数来插入
2)递归函数
扩展与提升:
为什么要在我们创建的头文件中对内联函数进行“定义”而非“声明”?
程序编译时会生成中间代码文件,即.obj文件(也叫目标文件),而内联函数的原型可能不会出现该文件中,另外编译器每次只针对一个编译单元,即一个.cpp文件。
如果我们在.h文件中只是声明了inline函数,其原型很可能不会出现最终的.obj文件中,在主函数中调用的函数被编译时可能被认为是普通函数,在最终的.obj文件中相应部分会被按照普通函数处理,即需要调用相应函数。所以连接器(ld)工作时就会出现问题,主函数中调用的函数无法在其他文件中找到。因此我们应该在头文件中对内联函数进行定义。