今日翻看《C++ Primer Plus》,看到一个陌生的东西--内联函数,立马前来记录一下。
内联函数和常规函数区别
为了明白内联函数和常规函数的区别,首先需要知道程序运行时,遇到常规函数时如何处理的:
编译过程的最终产品时可执行程序--由一组机器语言指令组成,运行程序时,操作系统将这些指令载入到计算机内存中,因此每条指令都有特定的内存地址,计算机随后逐步执行这些指令。
常规函数调用的时候,使得程序跳到另一个地址,并在函数结束时返回。
然而内联函数的编译代码直接与其它程序代码发生了“内联”,也就是说,程序无需跳到另一个位置执行代码。因此其运行速度比常规函数快,但是需要有更多内存。
一图胜千言:
inline关键字使用实例
通常的做法是:将函数定义和函数原型写在一起放在main函数之前,前面加上关键字inline
例子如下:
#include<iostream>
inline double square(double x){
return x*x;
}
int main()
{
using namespace std;
double a,b;
double c=13.0;
a=square(5.0);
b=square(4.5+7.5);
cout<<"a="<<a<<",b="<<b<<endl;
cout<<"c="<<c;
cout<<",c squared="<<square(c++)<<endl;
cout<<"Now c="<<c<<endl;
return 0;
}
运行结果:
可以看出,内联函数和常规函数一样,也是按值传参
内联与宏
inline工具是C++新增的特性。C语言使用预处理器语句#define提供宏——内联代码的原始实现,例如:
#define SQUARE(x) x*x
这并不是通过传参实现的,而是通过文本替换实现的
比如:b=SQUARE(4.5+7.5)会变成:b=4.5+7.5*4.5+7.5
为了解决,可以添加括号,即:
#define SQUARE(x) (x)*(x)
但仍有一个问题,比如传入c++的时候,会让c递增两次
所以如果使用C语言的宏执行类似函数的功能,应该考虑将其转换为内联函数
对于那些频繁使用且体量小的函数,内联函数是一个非常不错的选择!