C++读书笔记:内联函数

C++ 内联函数是通常与类一起使用。如果一个函数是内联的,那么在编译时,编译器会把该函数的代码副本放置在每个调用该函数的地方。

对内联函数进行任何修改,都需要重新编译函数的所有客户端,因为编译器需要重新更换一次所有的代码,否则将会继续使用旧的函数。

如果想把一个函数定义为内联函数,则需要在函数名前面放置关键字 inline,在调用函数之前需要对函数进行定义。如果已定义的函数多于一行,编译器会忽略 inline 限定符。

在类定义中的定义的函数都是内联函数,即使没有使用 inline 说明符。

下面是一个实例,使用内联函数来返回两个数中的最大值:

#include <iostream>
 
using namespace std;

inline int Max(int x, int y)
{
   return (x > y)? x : y;
}

// 程序的主函数
int main( )
{

   cout << "Max (20,10): " << Max(20,10) << endl;
   cout << "Max (0,200): " << Max(0,200) << endl;
   cout << "Max (100,1010): " << Max(100,1010) << endl;
   return 0;
}

当上面的代码被编译和执行时,它会产生下列结果:

Max (20,10): 20
Max (0,200): 200
Max (100,1010): 1010

为一个操作定义一个函数的好处有:
① 阅读和理解函数 max 的调用,要比读一条等价的条件表达式并解释它的含义要容易得多

② 如果需要做任何修改,修改函数要比找出并修改每一处等价表达式容易得多

③ 使用函数可以确保统一的行为,每个测试都保证以相同的方式实现

④ 函数可以重用,不必为其他应用程序重写代码

虽然有这么多好处,但是写成函数有一个潜在的缺点:调用函数比求解表达式要慢得多。

在大多数的机器上,调用函数都要做很多工作:调用前要先保存寄存器,并在返回时恢复,复制实参,程序还必须转向一个新位置执行

C++中支持内联函数,其目的是为了提高函数的执行效率,用关键字 inline 放在函数定义(注意是定义而非声明)的前面即可将函数指定为内联函数,内联函数通常就是将它在程序中的每个调用点上“内联地”展开,假设我们将 max 定义为内联函数:

inline int max(int a, int b)
{
 return a > b ? a : b;
}

则调用: cout<<max(a, b)<<endl;

在编译时展开为: cout<<(a > b ? a : b)<<endl;

从而消除了把 max写成函数的额外执行开销

内联函数具有以下优点:
1)不会发生函数调用开销。
2)当调用函数时,它还节省了推送/弹出变量在堆栈上的开销。
3)它还节省了函数返回调用的开销。
4)内联函数时,可以使编译器对函数体执行特定于上下文的优化。 对于正常的函数调用,这种优化是不可能的。 通过考虑调用上下文和被调用上下文的流程,可以获得其他优化。
5)对于嵌入式系统,内联函数可能很有用(如果它很小),因为内联可以产生比函数调用前导码和返回更少的代码。

内联功能缺点:
1)来自内联函数的添加变量消耗额外的寄存器,如果要使用寄存器的变量数增加,则在内联函数之后,它们可能会在寄存器变量资源利用率上产生开销。这意味着当在函数调用点替换内联函数体时,函数使用的变量总数也会被插入。因此,用于变量的寄存器数量也将增加。因此,如果在函数内联变量数量大幅增加之后,它肯定会导致寄存器利用率的开销。

2)如果使用太多的内联函数,那么二进制可执行文件的大小将会很大,因为相同代码的重复。

3)太多的内联也会降低指令缓存命中率,从而降低从缓存内存到主内存的指令获取速度。

4)如果有人更改了内联函数中的代码,则内联函数可能会增加编译时间开销,因此必须重新编译所有调用位置,因为编译器需要再次替换所有代码以反映更改,否则它将继续使用旧功能。

5)内联函数可能对许多嵌入式系统没用。因为在嵌入式系统中,代码大小比速度更重要。

6)内联函数可能会导致颠簸,因为内联可能会增加二进制可执行文件的大小。内存中的颠簸会导致计算机性能下降。

内联函数是用目标代码的增加为代价来换取时间的节省。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值