程序文本编译后会得到可执行文件,而可执行文件由一系列的指令构成,这些指令以一定的顺序存储在内存中,计算机将逐步执行这些语句,函数调用的指令只是主程序语句序列中的一条。函数本身也是一系列指令序列的集合,而函数调用的指令会在执行该指令时跳转到函数的指令集合存储的地址,执行完指令后返回原来主程序中函数调用这一指令所在的地址中,继续执行主程序剩下了的指令。
常规函数
常规函数调用的具体过程如下:
- 记录当前所执行指令的地址
- 将参数传递到为函数形参分配的存储空间中(函数原型就像两个指令集间的接口,分配了一块两个指令集共用的内存和访问方式)
- 跳转到函数指令集合存储的起始地址
- 执行函数指令
- 将返回值传递到指定地址中(CPU寄存器,特定的内存)
- 执行完函数所有指令后跳转回第一步中标记的地址
可以看出函数调用的过程会在地址中来回跳转,造成一定的开销。
内联函数
内联函数调用的方式和函数不一样,内联函数在编译时会将函数替换为实现该函数的代码,再转换为指令集,函数的指令将成为主程序指令序列的一部分。
- 内联函数的调用比函数占用了更多的存储指令的内存,所以不适用于大的函数
- 内联函数不需要像函数调用那样跳转,能节省执行程序的开销
综上所述,内联函数适用于内存开销少,执行开销大(多次调用)的函数。
内联函数的使用
inline int f1(int i) {return i+1;}
使用关键字inline定义内联函数,只有一个指令集,不需要接口(函数原型),将整个定义(函数头+函数代码)放在放函数原型的地方。