c语言inline函数的使用

本文探讨了C语言中inline函数的使用,包括其优化作用、限制条件以及不当使用可能导致的性能下降。作者通过实验说明,inline函数并不总是提高效率,过度使用可能导致代码分散,影响缓存命中率,从而降低性能。同时,建议将inline函数定义在单独的-inl.h头文件中,以确保正确使用。

大学在教科书上学习过inline函数,定义为inline函数之后,会省去函数调用的开销,直接嵌套汇编代码,取代函数调用,提高效率。工作后项目中也 很少用到inline来定义函数,近几天在研读google的google c++ style guide,发现之前自己对inline函数的认识太过肤浅了,这里学习总结一下。
  1、inline函数不要超过10行代码,且不能包含循环、switch、if语句
  2、在一个c文件中定义的inline函数是不能在其它c文件中直接使用,google推荐把inline函数定义在**-inl.h头文件中。
  3、不要过度使用inline函数定义,尤其对大函数来说
  上面三点说明如何正确的使用inline函数,我以前的时候对inline理解不透彻,使用inline的方式不正确,但现在编译器够先进,能保证错误的inline定义也可以正确编译、运行。可能会有性能的缺失。
  我在F14(gcc 版本 4.5.1 20100924 (Red Hat 4.5.1-4) (GCC))上做了个实验:
  1、当inline函数超过10行,并且包含了循环、switch语句后gcc会执行inline语义,将inline函数汇编嵌入到main函数中。
  //gcc n.c -O2 -S
  #include
  #include
  //inline int inc_inline(volatile int *j);
  inline int inc_inline(volatile int *j)
  {
  for (;*j < 100; (*j)++)
  {
  *j += 2;
  (*j)++;
  }
  switch (*j)
  {
  case 1:
  (*j)++;
  break;
  case 2:
  (*j)++;
  break;
  default:
  break;
  }
  return (*j)++;
  }
  int main(int argc, char *argv[])
  {
  volatile int i = 0;
  inc_inline(&i);
  printf(“i;%d\n”, i);
  return 0;
  }
  2、当我把inline函数的定义放到另一个c文件中,在main函数文件中声明此函数,此时inline函数不生效,gcc编译出的汇编使用call进行正常的函数调用。
  //gcc n.c a.c -O2 -S
  3、当我们过度使用inline函数,会造成程序文件变大,性能降低。程序文件变大是肯定的,但为什么性能会降低呢,inline不是为了提高性能吗?使 用的方式不正确性能不能提高,反而会下降。现在的CPU上都有cache,紧凑的代码在chache中保存的时间更长,这样cache命中的机会更高。
  如果某个A函数未定义为inline,并且被很多其它函数调用,那个这个A函数很大的可能会长期被保存在cahe中,这样CPU对代码的执行速度会提高很 多。如果A函数被定义为了inline函数,代码分散各个调用函数中,这样每次指定都不命中都需要去内存把代码拷贝到cache中,然后执行,造成很大的 抖动。
  更深一层的理解,当函数整个函数编译为的汇编代码,函数调用的上下文切换占用了大多的时间的时候,可以考虑把此函数定义为inline函数。
  
c语言交流裙:1126743406交流一下经验
下面分享一些视频资料
C语言编程基础
C语言实现面向对象编程
Linux C语言高级开发

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值