C++之内联函数

9 篇文章 0 订阅

C++之内联函数

为什么要有内联函数

我们编写了一个小函数,它的功能是比较两个string形参的长度并返回长度较小的string的引用。

// 挑出两个string 对象中较短的那个,返回其引用
const string & shorterString(const string &s1, const string &s2)
{
	return s1.size() <= s2.size() ? s1 : s2;
}

把这种规模较小的操作定义成函数有很多好处,主要包括:

  • 阅读和理解shorterString函数的调用要比读懂等价的条件表达式容易得多。
  • 使用函数可以确保行为的统一,每次相关操作都能保证按照同样的方式进行。
  • 如果我们需要修改计算过程,显然修改函数要比先找到等价表达式所有出现的地方再逐一修改更容易。
  • 函数可以被其他应用重复利用,省去了重新编写的代价。

然而,使用shorterString函数也存在一个潜在的缺点:调用函数一般比求等价表达式的值要慢一些。
在大多数机器上,一次函数调用其实包含着一系列工作:

常规函数调用使程序跳到另一个地址(被调用的函数的地址),并在函数结束时返回。执行到函数调用指令时,程序将在函数调用后立即存储该指令的内存地址,并将函数参数复制到堆栈,跳到标记函数起点的内存单元,执行函数代码,然后跳回到地址被保存的指令处。来回跳跃并记录跳跃位置意味着以前使用函数时,需要一定的开销。

这与阅读文章时停下来看脚注,并在阅读完脚注后返回到以前阅读的地方类似。

C++是如何处理的

内联函数是C++为提高程序运行速度所做的一项改进。

常规函数和内联函数之间的主要区别不在于编写方式,而在于C++编译器如何将它们组合到程序中。

内联函数的编译代码与其他程序代码“内联”起来了。也就是说,编译器将使用相应的函数代码替换函数调用。对于内联代码,程序无需跳到另一个位置处执行代码,再跳回来。因此,内联函数的运行速度比常规函数稍快,但代价是需要占用更多内存。

语法

在shorterString函数的返回类型前面加上关键字inline,这样就可以将它声明成内联函数了:

// 内联版本:寻找两个string 对象中较短的那个
inline const string & shorterString(const string &s1, const string &s2)
{
	return s1.size() <= s2.size() ? s1 : s2;
}

image-20230531220346297

注意

  • 内联说明只是向编译器发出的一个请求,编译器可以选择忽略这个请求。
  • 一般来说,内联机制用于优化规模较小、流程直接、频繁调用的函数。很多编译器都不支持内联递归函数。
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值