C++知识总结——内联函数与宏

1.内联函数

1.1什么是内联函数

​​​  内联函数是c++的增强特性之一,用以提高程序运行速度所做的改进。当编译器发现某段代码在调用一个内联函数时,它不是去调用该函数,而是将该函数的代码,整段插入到当前位置。谈及内联函数我们首先需要知道常规函数调用过程。我们都知道编译过程的最终产物是可执行程序,程序运行时,操作系统将指令再如计算机内存,每条指令都有特定的内存地址,计算机然后又逐步执行指令,当程序执行到常规函数调用时,程序会跳转到函数地址,在函数调用结束后返回,更加详细来说就是程序执行到函数调用指令时,程序会在函数调用后立即存储该指令的内存地址,并将函数参数复制到堆栈中,跳转到函数内存地址并执行函数代码,当执行结束后跳转回原来保存的地址处。这样来回跳转并进行参数复制会降低程序运行的速度。

​​​  因此内联函数提供的选择是将编译代码与其他程序代码“内联”起来,编译器在使用函数代码直接代替函数调用(这种替换行为发生在编译阶段而非程序运行阶段),对于内联函数,程序不需要跳转执行代码,没有函数压栈的开销,因此程序运行速度会稍快,但是会占用更多的内存空间。

1.2选择使用内联函数

使用原则:

​​​  1.定义函数时,在函数的最前面以关键字inline声明函数,即可使函数称为内联声明函数。

​​​  2.内联函数的定义性声明应该出现在对该函数的第一次调用之前。

​​​  3.内联函数首先是函数,函数的很多性质都适用于内联函数,如内联函数可以重载。

​​​  4.内联函数体中,不能有循环语句、if语句或switch语句,否则,函数定义时即使有inline关键字,编译器也会把该函数作为非内联函数处理。

​​​  值得注意的是,内联函数仅仅是对编译器的内联建议,编译器是否觉得采取你的建议取决于函数是否符合内联的有利条件。如果函数体非常大,那么编译器将忽略函数的内联声明,而将内联函数作为普通函数处理。

使用实例:
在这里插入图片描述
在这里插入图片描述

1.3内联函数优缺点

优点:

  1. 它通过避免函数调用所带来的开销来提高你程序的运行速度。

  2. 当函数调用发生时,它节省了变量弹栈、压栈的开销。

  3. 它避免了一个函数执行完返回原现场的开销。

  4. 通过将函数声明为内联,你可以把函数定义放在头文件内。

缺点:

  1. 因为代码的扩展,内联函数增大了可执行程序的体积。

  2. C++内联函数的展开是在编译阶段,这就意味着如果你的内联函数发生了改动,那么就需要重新编译代码。

  3. 当你把内联函数放在头文件中时,它将会使你的头文件信息变多,不过头文件的使用者不用在意这些。

  4. 有时候内联函数并不受到青睐,比如在嵌入式系统中,嵌入式系统的存储约束可能不允许体积很大的可执行程序。

1.4内联函数与宏

​​​  inline是c++新增的特性,在c语言中是使用预处理器语句#define来提供宏——内联代码的原始实现,宏并不是通过传递参数实现的,而是通过文本替换来实现的。
在这里插入图片描述
​​​  这里的b结果明显是错误的,这就是因为宏不能够按照值传递,只是进行简单的文本替换。

inline函数和宏的区别

  • inline 在编译阶段进行参数类型检查和安全检查,宏处理在预编译期间,不进行参数类型检查和安全检查。
  • inline是一种更安全的宏。

1.5内联函数补充

类中的内联函数:定义位于类声明中的函数都将自动成为内联函数

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值