内联函数

一般来说,调用一个函数流程为:当前调用命令的地址被保存下来,程序流跳转到所调用的函数并执行该函数,最后跳转回之前所保存的命令地址。

对于需要经常调用的小函数来说,这大大降低了程序运行效率。所以,C99 新增了内联函数(inline function)。

关键字 inline 告诉编译器,任何地方只要调用内联函数,就直接把该函数的机器码插入到调用它的地方。这样程序执行更有效率,就好像将内联函数中的语句直接插入到了源代码文件中需要调用该函数的地方一样。

要将一个函数定义为内联函数,需要在函数定义时加上 inline 函数修饰符

inline void swapf( float *p1, float *p2 )    
{
   float tmp = *p1; *p1 = *p2; *p2 = tmp;
}

void selection_sortf( float a[], int n )       
{
  register int i, j, mini;                      
  for ( i = 0; i < n - 1; ++i )
  {
    mini = i;                                 
    for ( j = i+1; j < n; ++j )
      if ( a[j] < a[mini] )
        mini = j;
      swapf( a+i, a+mini);                     
  }
}

一般来说,不建议把将包含循环的函数定义成内联函数,例如函数 selection_sortf()。例 1 在 for 循环中使用内联函数来加速执行效率。

inline 修饰符并非强制性的:编译器有可能会置之不理。例如,递归函数通常不会被编译成内联函数。编译器有权自行决定是否要将有 inline 修饰符的函数编译成内联函数。

和其他函数不同的是,在每个用到内联函数的翻译单元中,都必须重复定义这个内联函数。编译器必须时刻准备好该函数定义,以便在调用它时及时插入内联代码。因此,经常在头文件中定义内联函数。

如果某个翻译单元内的某个函数的所有声明都具有 inline 修饰符,而没有 extern 修饰符,那么该函数具有内联定义(inline definition)。

内联定义只针对翻译单元,它不构成外部定义,因此别的翻译单元可以包含该函数的外部定义。如果有外部定义附加到内联定义中,那么编译器可以自由选择要使用哪一种定义。
内联函数其实就是普通函数,只不过它们在调用时采用机器码形式。和普通函数一样,内联函数具有自己的地址。如果内联函数使用到宏,预处理器就会展开宏,展开时所用的宏值,取该内联函数在源代码中定义所在位置的宏值。然而,在没被声明为 static 的内联函数中,不应该以静态存储周期的方式来定义可修改的对象。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值