一、宏函数
#define FUNC(arg) arg*10
不是真正的函数,就是带参数的宏,使用宏函数的位置会先替换成宏函数后面的代码,然后根据提供的参数替换掉对应参数的位置
注意:可以使用续行符和大括号来保护代码
二义性:
由于宏所处位置或参数不同可能导致宏有多种解释,这就叫宏的二义性
可以在最外层加小括号,每个参数都加小括号,以此降低产生二义性的可能,不要在宏中使用自变运算符
运算符:
# 把宏函数的参数变成字符串
## 合并两个参数变成标识符
二、内联函数(函数前面+inline)
1、普通函数
普通函数会被翻译成二进制指令存储在代码段中,调用语句会生成一句跳转指令,当程序运行到跳转语句时,就会跳转到函数所在的代码段中的位置执行,执行完后会跳转返回。
2、什么是内联函数
内联函数也会被翻译成二进制指令,调用语句不会生成跳转指令,而是直接把内联函数的二进制指令替换调用语句,这样就没有发生跳转和返回,而是直接执行被调用函数,我们把这种函数称为内联函数
3、显式内联和隐式内联
显式内联:在函数的返回值之前添加 inline 该函数就以内联机制调用,但并不是所有的编译器都支持,我们现在使用的gcc以及g++就不支持
隐式内联:结构、联合、类的成员函数会自动被当做内联函数处理
4、内联适用的条件
内联的优点:
节约了函数传参、跳转、返回的时间,提高代码的运行速度
内联的缺点:
当内联函数在多个位置调用时,那么该函数的二进制指令就会形成多份,造成代码冗余,因此最终的可执行文件大小增加
适用条件:
1、适合内容简单且频繁调用的函数(一次调用执行多次),内容多且多次出现调用语句的函数就不适合内联,因为它节约的时间弥不了牺牲的内存
2、带有递归属性的函数无法内联,编译器会自动忽略inline关键字
总结:
相同点:
都是采用以空间换时间的策略,来提高程序的执行速度
不同点:(不同点于宏函数和普通函数的不同点相同)
1、宏函数不是真正的函数,而是语句的替换,不会传参,没有类型检查,没有返回值,安全性低,具有二义性
2、内联函数是真正的函数,会传参,有严格的类型检查、有返回值、比宏函数安全