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)递归函数


扩展与提升:

为什么要在我们创建的头文件中对内联函数进行“定义”而非“声明”?

ios 内联函数 外联函数 外部内联函数_内联函数

程序编译时会生成中间代码文件,即.obj文件(也叫目标文件),而内联函数的原型可能不会出现该文件中,另外编译器每次只针对一个编译单元,即一个.cpp文件。

如果我们在.h文件中只是声明了inline函数,其原型很可能不会出现最终的.obj文件中,在主函数中调用的函数被编译时可能被认为是普通函数,在最终的.obj文件中相应部分会被按照普通函数处理,即需要调用相应函数。所以连接器(ld)工作时就会出现问题,主函数中调用的函数无法在其他文件中找到。因此我们应该在头文件中对内联函数进行定义。