内联函数和宏
宏定义是C语言提出的,它在预处理的地方将代码展开,这样做,相比于函数调用,可减少额外的时间和空间开销。
但是宏定义有一些缺点,最明显的是,它容易产生二义性。如:#define MAX(a, b) a>b?a:b
使用该宏: MAX( num1, num2 ,因为宏展开后变成
num1>num2 ?num1:num2,但是,如果是这样调用的:MAX( 17+32, 25+21),编译时出现错误,原因是,宏展开后变成: 17+32>25+21?17+32:25+21(shit!!!)
所以,宏在使用时,参数一定要加上括号,上述的那个例子改成如下所示就能解决问题了。
define MAX( (a), (b) ) (a)>(b)?(a):(b)
即使是这样,这个宏仍有Bug,因为如果我这样调用 MAX(i++,j++),经过这个宏以后,(自己试了下,只有i和j中大的那个被累加了两次)
为了克服C语言宏的断言,C++提提出了内联函数。内联函数和宏的区别在于,宏是由预处理器对宏进行替代,而内联函数是通过编译器控制来实现的。 而且内联函数是真正的函数,只是在需要用到的时候,内联函数像宏一样的展开,所以取消了函数的参数压栈,减少了调用的开销,而且,内联函数会进行参数类型检查,更加安全
总结:
相同点:(1) 两者都会对定义进行展开,以减少函数调用带来的开销; (2) 两者均适合代码量较小的函数,如果代码量过大,宏展开会占用大量内存,会降低程序执行速度;而对于内联函数,编译器可能会将之视为非内联函数使用。
不同点:宏是由预处理器对宏进行文本替换,而内联函数通过编译器进行替换,且它是真正的函数,会对参数类型进行检查,更加安全。