天天看点

解析宏函数与内联函数

一、宏函数的优点

不会进行传参、入栈、出栈,以及函数调用时的跳转,因此执行速度比正常函数要快

二、宏函数的缺点

不检查数据类型,没有返回值,仅有一个运行结果,每使用一次就会把表达展开一次,会造成代码段的冗余,导致可执行文件变大,而且宏函数容易出现二义性(会根据参数的不同、环境不同发生变化)

三、内联函数的优点

提高程序的运行速度(因为没有跳转,也不需要返回)

四、内联函数的缺点

会导致可执行文件增大(冗余),也就是牺牲空间来换取时间

五、为什么内联函数会提高程序运行速度

普通函数调用时是生成调用指令(跳转),然后当代码执行到调用位置时跳转到函数所在的代码段中执行,内联函数就把函数编译好的二进制指令直接复制到函数的调用位置,所以提高了程序运行的速度

六、显示内联与隐式内联

显式内联:在函数前 inline(C语言C99标准也支持,inline是建议性关键字,当请求将函数作为内联函数时,编译器并不一定会满足这种要求)

隐式内联:结构、类中内部直接定义的成员函数,则该类型函数会被优化成内联函数

七、内联函数适用的条件

1、由于内联会造成可执行文件变大,并增加内存开销,因此只有频繁调用的简单函数适合作为内联函数

2、调用比较少的复杂函数,内联后并不显著提高性能,不足以抵消牺牲空间带来的损失,所以不适合内联

3、带有递归特性和动态绑定特性的函数,无法实施内联,因此编译器会忽略声明部分的inline关键字

六、内联函数和宏函数的区别

1、展开的时间不同,内联函数在编绎时展开,宏在预编译时展开

2、编译内联函数可以嵌入到目标代码,宏只是简单文本替换

3、内联会做类型,语法检查,而宏不具这样功能

4、宏不是函数,内联函数是函数

5、宏定义小心处理宏参数(一般参数要括号起来),否则易出现二义性,而内联定义不会出现

继续阅读