C++PrimerPlus 学习笔记 | 第八章 函数探幽 | 1. 内联函数

本文探讨了C++内联函数的工作原理,如何通过避免函数调用开销优化性能,以及何时选择内联函数而非常规函数。它还比较了内联函数与宏函数的优缺点,并强调了在实际开发中的应用策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

内联函数

当我们使用函数,会使得函数从当前位置跳跃到另一个位置开始执行,还需要记住当前位置以便返回,然后来回跳跃和记忆是需要时间的,所以C++提供了另外一种方式也就是内联函数,内联函数的编译代码与其他的程序代码“内联”起来了,也就是说编译器将会使用相应的内联函数的代码替换函数调用,对于内联函数程序无需跳转到另一个位置。所以内联函数运行速度比常规函数稍快,但代价是占用更多内存,如果一个程序在不同的10处内联函数调用,那么这个程序将包含这段代码的十个副本。

如果执行函数代码比处理函数调用机制的时间长,则不需要内联函数,省去的时间有限。若果执行函数代码时间远小于处理函数调用机制时间,则可以考虑使用内联函数。

内联函数适用于 函数调用机制所占用的时间占据总时间相当比例,且函数调用频繁,且调用口不多的函数类型。

(有些时候特定的表达式可以用内联函数表示,清晰清楚,且省去了函数调用机制的消耗的时间)

内联函数的实现

要使用内联函数必须要在声明和定义的前面加上关键字 inline,通常的做法是省去原型从而直接实现。(内联本身较短)

inline double square(int x){
    return x * x;
}

但是并不是所有的内联函数请求都会被满足,编译器可能认为该函数过大,或者函数存在递归的美好

内联函数与宏函数

我们注意到我们有时候也使用宏函数来处理以上提到的函数调用机制占用时间过大的问题,在解决这个问题的情况下,宏函数似乎比内联函数更加彻底,基于文本替换的宏定义,完全省去了函数调用机制,似乎远胜于内联函数?其实不然正应为基于文本替换导致了许多很隐蔽的问题,看如下宏函数

#define SQUARE(x) x*x

来看一组调用

SQUARE(1) //-> 1*1 = 1 -> 正确
SQUARE(1+1) //-> 1 + 1 * 1 + 1 = 3 ->错误
// 假设 a=1
SQUARE(a++) //-> a++ * a++ -> 错误 在同一条语句多次对同一个变量进行自增自减会出现未定义的结果 

我们发现宏函数在处理很多问题的时候出现很多的问题,所以在C++开发中我们更加推荐使用内联函数替代宏函数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值