宏定义与内联函数的区别与联系

一、宏定义和内联函数的区别

1. 宏定义不是函数,但是使用起来像函数。预处理阶段用复制宏代码的方式代替函数的调用,省去了函数压栈退栈过程,提高了效率。

  内联函数本质上是一个函数,内联函数一般用于函数体的代码比较简单的函数,不能包含复杂的控制语句,while、switch,并且内联函数本身不能直接调用自身。如果内联函数的函数体过大,编译器会自动的把这个内联函数变成普通函数。内联函数则是在编译的时候进行代码插入,编译器会在每处调用内联函数的地方直接把内联函数的内容展开,这样可以省去函数的调用的开销,提高效率;

2.宏定义是没有类型检查的,无论对还是错都是直接替换,而内联函数在编译时进行安全检查

内联函数在编译的时候会进行类型的检查,内联函数满足函数的性质,比如有返回值、参数列表等

二、内联函数和普通函数的区别

1. 内联函数和普通函数的参数传递机制相同,但是编译器会在每处调用内联函数的地方将内联函数内容展开,这样既避免了函数调用的开销又没有宏机制的缺陷

2.普通函数在被调用的时候,系统首先要到函数的入口地址去执行函数体,执行完成之后再回到函数调用的地方继续执行,函数始终只有一个复制。

内联函数不需要寻址,当执行到内联函数的时候,将此函数展开,如果程序中有N次调用了内联函数则会有N次展开函数代码

3. 内联函数有一定的限制,内联函数体要求代码简单,不能包含复杂的结构控制语句。如果内联函数函数体过于复杂,编译器将自动把内联函数当成普通函数来执行

4.内联函数与static修饰函数的区别: 不用开栈清栈;相同点是所修饰的函数都是本文件可见(起因不同前者是代码展开,后者是static修饰造成生成符号为local属性)

内联的特点:编译阶段的文本插入;

只在debug版本下生效;

只是给编译器的建议,具体适用与否取决于开栈开销大小与执行开销大小的相对关系;

内联基于实现而不是声明,关键字加载定义处;

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值