内联函数和带参数的宏的区别

(1)、内联函数

当程序执行函数调用时,系统要建立栈空间,保护现场,传递参数以及控制程序执行的转移等等,这些工作需要系统时间和空间的开销。有些情况下,函数本身功能简单,代码很短,但使用频率却很高,程序频繁调用该函数所花费的时间却很多,从而使得程序执行效率降低。


为了提高效率,一个解决办法就是不使用函数,直接将函数的代码嵌入到程序中,可以使用带参数的宏定义实现,但是这种方法也有缺点,程序可读性往往没有使用函数的好,如果缺少了一些括号还可能出现歧义。


为了协调好效率和可读性之间的矛盾,C++提供了另一种方法,即定义内联函数,方法是在定义函数时用修饰词inline。inline关键字告诉编译器,这个函数的调用要尽可能快,可以当普通的函数调用实现,也可以用宏展开的办法实现。在C99也引入了inline 关键字。


(2)、内联函数和带参数的宏的区别

inline int max(int a, int b)
{
return a > b ? a : b;
}

#define MAX(a, b)  ((a) > (b) ? (a) : (b))


内联函数调用时,要求实参和形参的类型一致,另外内联函数会先对实参表达式进行求值,然后传递给形参;如果实参表达式有Side Effect,那么这些SideEffect只发生一次。例如MAX(++a, ++b),如果MAX是个真正的函数,a和b只增加一次。而宏调用时只用实参简单地替换形参;如果MAX是上面那样的宏定义,则要展开成k = ((++a)>(++b)?(++a):(++b)),a和b 增加的次数就难说了。


内联函数是在编译的时候、在调用的地方将代码展开的,而参数宏则是在预处理时进行替换的,故生成的目标文件都比较大。


在C++中建议采用inline函数来替换带参数的宏

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章