普通函数:
普通函数调用时会使程序跳到另一个地址(函数的地址),并且在函数结束时返回。
- 执行函数调用指令,立即存储该指令的地址,并将函数参数保存到的堆栈。
- 跳到函数起点的内存单元,执行函数代码(将返回值保存到寄存器中。
- 跳回被保存指令的地址处。
来回跳跃并记录跳跃位置意味着使用普通函数时,需要一定的开销。
内联函数:
内联函数就是 编译器将使用相应的函数代码代替了函数调用,所以内联函数的运行速度比普通函数快,但代价是占用了更多的内存。 (以空间换时间,内联函数不是在调用时发生控制转移,而是在编译时用函数体替换函数调用,从而节省了参数传递、控制转移等开销)
内联函数存在的意义就是为了提高程序运行的速度,提高程序的执行效率,但并不是所有加上inline关键字的函数都是内联函数,编译器会识别该函数的复杂程度,若过于复杂,即使被声明为内联函数,编译器也会按照普通函数去处理;若函数比较简单,即使没有声明为内联函数,编译器也会按照内联函数处理。
- 内联函数中不能有循环语句和Switch语句;
- 内联函数的定义必须出现在内联函数第一次被调用之前
- 对内联函数不能进行异常接口声明
选择使用内联函数?
- 如果代码执行时间很短,这使得非内联调用的时间显得占比大。则内联调用就可以节省大部分时间。
- 如果该函数多次使用,如果要求速度,就用内联函数;要求内存,就用普通函数调用。