内联函数和宏定义的总结

内联(inline)函数,不同于普通函数的是:普通函数是在编译是和调用者分别编译,运行到调用处时,将原函数的信息入栈,新函数执行。而内联函数,在编译时就直接把调用函数语句替换为整个内联函数代码(变量名对应替换),运行行时这些就当做一条条语句执行,不必再调用、切换函数。

可见:

内联函数的优点:节省时间,减少了运行时函数调用的时间开销(参数值传递,主调函数和被调函数运行栈的切换)。

缺点:占用空间,每调用一次就要替换一次函数代码,编译生成的目标代码可能很长。

总体讲就是以空间换时间。

在使用内联函数时,应注意如下几点: 

1.在内联函数内不允许用循环和判断语句不能递归,否则编译将该函数当做普通函数处理。内联函数一般只适合于只有1~5行的小函数。对一个含有许多语句的大函数,函数调用和返回的开销相对于整个函数来说非常小,所以也没有必要用内联函数实现。

2.内联函数的定义必须出现在内联函数第一次被调用之前。

3.在C++中,在类的内部定义了函数体的函数,即使没有inline修饰,被默认为是内联函数。 


宏定义和内联函数类似,都是以空间换时间,都能一定程度上加快程序的执行。

宏定义是C语言提供的三种预处理功能的其中一种,这三种预处理包括:宏定义、文件包含、条件编译。

宏定义将宏名替换为字符串。

但二者有差别:

1.宏定义是在预处理阶段由预处理器替换,内联函数是在编译时编译器执行。

2.内联函数还是有函数的特性,而宏定义真的只是简单的字符串替换,容易出现一些问题。

例如:#define MULTI(x) (x*x)

在某个函数中调用MULTI(3+3),理想结果是6*6=36,而事实上3+3*3+3=15

所以宏定义的变量一般要加括号,这是一个注意点,也是一种好习惯:

#define MULTI(x) ((x)*(x))

但即使这样,还是会出问题:

当调用a=2; b= MULTI(a++);  后  理想是b=4,a=3,而事实上b=4,a加了两次a=4。

为了解决这些问题可以用内联函数替代宏定义,就不会发生这些错误。

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值