inline 与 define

来源:互联网 发布:手机制作软件工具 编辑:程序博客网 时间:2024/06/03 20:32

inline函数(内联函数)是C++相对于C的一个新特性,它长这样:

inline double square(double x) { return x * x; };

为什么要有这么一个新特性呢?

程序都是由一条一条指令组成的,要运行程序的时候,操作系统把这些指令载入到内存,CPU再一条一条
地执行这些指令。一般情况下,执行到一条函数调用的指令时,程序要先存储这条指令的内存地址,把函
数参数复制到堆栈中,再跳到函数起点的内存单元处去执行函数代码,执行完了还要再跳回到调用函数的
地方,然后才能继续往下执行。这些跳来跳去的过程都需要一定的时间开销,C++的一大追求就是快、高
效,对于这种浪费时间的行为当然不能忍,于是就有了inline函数。

内联函数,顾名思义,就是把函数代码都塞到函数调用的地方去,执行的时候就不需要再跑来跑去了,节
省了时间。

内联函数声明只需要在普通的函数声明前面加一个inline就行了,再顾名思义一下,inline,就是在一
行里面,所以一般内联函数都写在一行里面,如果函数代码有很多行的话一般是不用内联的,道理其实很
简单,一行代码的执行时间很短,如果用一般的函数的话中间跳来跳去的时间相对于函数执行的时间还是
比较多的,但如果函数本身有很多行,自己执行就要不少时间,那中间这个跳来跳去的时间相对于函数代
码执行的时间就可以忽略不计了,所以内联函数一般只有一行。

看到这里,肯定有很多人想到了C语言的宏定义#define, 例如上面那行代码可以用宏定义这样实现:

#define square(x) ((x)*(x))

被坑过的人肯定都知道变量都要用括号括起来,这样一来对于square(4.0)、square(4.0+5.0)这
样的调用似乎用内联函数还是宏定义并没有什么区别。

然鹅, 如果这样用呢:

square(a++);

a是一个double变量。

由于宏只是简单的替换,将会导致最后这一行执行完后a自加了两次(把宏展开就看得清楚了,我懒,就不
写了。。。),而使用内联函数则不会出现这种问题,并且不需要每次都小心翼翼地把变量括起来,所以
内联函数的功能是远远胜过宏定义的,因此

能用inline就不要用define!

这里说的是内联函数和宏的功能一样的时候内联函数是最优选择,但有时候还是有些十分炫酷的奇技淫巧
会用到宏的,比如可以用一个宏来生成不同的函数,有兴趣可以自己去查查看。

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 家长管的太严怎么办 对于老公沉迷于股票怎么办 月经期吃了香瓜怎么办 月经漏到内裤上怎么办 上班没时间养狗怎么办 宝宝呼吸道感染反复发烧怎么办 熬夜后头晕想吐怎么办 生气后全身无力酸痛怎么办? 久坐导致的腰疼怎么办 削土豆手变黑了怎么办 熬夜后头痛眼痛怎么办 孩子毎天通宵游戏怎么办 熬夜写作业困了怎么办 三十多岁白头发越来越多怎么办 AI界面字体太小怎么办 睡不着怎么办躺倒床上脑子混乱 作息规律不正常夜里睡不着怎么办 作息不规律引起身体痒怎么办 在大学里好无聊怎么办 开会时间通知错了怎么办 商场要求商户变更位置怎么办 怀孕初期症状小腹痛怎么办 1岁半宝宝吃夜奶怎么办 戒奶宝宝不喝奶粉怎么办 2岁半宝宝老晚睡怎么办 老是熬夜然后想调生物钟怎么办 一个月宝宝睡眠不好怎么办 个人怎么办一清pos机 社保到退休年龄未交满15年怎么办 退休时社保没交满15时怎么办 单位不支付病假工资怎么办 一年级学生上课注意力不集中怎么办 一年级学生的理解能力差怎么办 一年级学生学习太差怎么办 宝宝屁眼破皮怎么办啊 九个月婴儿不爱喝奶怎么办 十一个月婴儿发烧怎么办 四个月宝宝睡不踏实怎么办 5个月宝宝瘦了怎么办 宝宝只吃迷糊奶怎么办 宝宝五个月了不吃奶粉怎么办