【正确答案】
【答案解析】宏代码本身不是函数,但使用起来却像函数,预处理器用复制宏代码的方式代替函数调用,省去了参数压栈、生成汇编语言的CALL调用、返回参数、执行return等过程,从而提高了速度。内联函数是代码被插入到调用者代码处的函数。对于C++而言,内联函数(inline)的作用也不是万能的,它的使用是有所限制的,它只适合函数体内代码简单的函数使用,不能包含复杂的结构控制语句(如while、switch),并且内联函数本身不能直接调用递归函数(自己内部还调用自己的函数)。
两者的区别主要表现在以下几个方面:第一,宏定义是在预处理阶段进行代码替换,而内联函数是在编译阶段插入代码;第二,宏定义没有类型检查,而内联函数有类型检查。
引申:内联函数与普通函数的区别有哪些?
内联函数的参数传递机制与普通函数相同,但是编译器会在每处调用内联函数的地方将内联函数的内容展开,这样既避免了函数调用的开销,又没有宏机制的缺陷。
内联函数和普通函数最大的区别在于其内部的实现方面上,普通函数在被调用时,系统首先要跳跃到该函数的入口地址,执行函数体,执行完成后,再返回到函数调用的地方,函数始终只有一个复制;而内联函数则不需要进行一个寻址的过程,当执行到内联函数时,此函数展开,如果在N处调用了此内联函数,则此函数就会有N个代码段的复制。
内联函数也并非是万金油,在使用的过程中也存在一定的局限性,如果函数体过大,编译器也会放弃内联方式,而采用普通的方式调用函数。此时,内联函数就和普通函数执行效率一样了。