C++对于关键字“inline”的处理大家都知道,C++编译器对于内敛函数就是把它当做一个宏展开。这样可能会增加程序的代码量,却可以减少程序入栈和出栈的此处,从而影响程序的执行速度。但是,C语言中扩展了C++的这个关键字,不同的编译器对它的处理还不一样。ADS的C编译器对“inline”还不支持,而本文主要谈arm-linux-gcc对“inline”的处理。

  下边是对“arm-linux-gcc的C编译器对 inline处理”的测试。
无关键字的程序inline的程序代码:

static void wait(volatile unsigned long dly)
{
    for(; dly > 0; dly--);
}
int main(void)
{
 unsigned long i = 0;
 // LED1,LED2,LED3,LED4对应的4根引脚设为输出
 GPBCON = GPB5_out | GPB6_out | GPB7_out | GPB8_out;

 while(1){
  wait(30000);
  GPBDAT = (~(i<<5));   // 根据i的值,点亮LED1,2,3,4
  if(++i == 16)
   i = 0;
 }
 return 0;
}

有关键字的程序inline:

static inline void wait(volatile unsigned long dly)
{
    for(; dly > 0; dly--);
}
int main(void)
{
 unsigned long i = 0;
 
 // LED1,LED2,LED3,LED4对应的4根引脚设为输出
 GPBCON = GPB5_out | GPB6_out | GPB7_out | GPB8_out;

  while(1){
  wait(30000);
  GPBDAT = (~(i<<5));   // 根据i的值,点亮LED1,2,3,4
  if(++i == 16)
   i = 0;
 }
 return 0;
} 


 
结论:我通过它们的反汇编代码比较看出,加inline的情况是“先链接的是main()函数,而wait()函数后链接”;而没加inline的情况是“wait()函数先链接,然后才是main()函数”。但是,我并没有看到加inline的wait()函数作为一个宏在main()函数中被展开,所以arm-linux-gcc的C编译器对“inline”的处理与C++编译器对“inline”的处理是不一样的。

   顺便插一段文字,关于入栈出栈的时间问题。还是这个程序代码,下边的代码编译后,wait()函数还是需要被main()函数调用,也就是说还是要入栈出栈。而当我在arm-linux-gcc后边加入优化选项时,有时就可以把wait()函数就当做一个宏展开,这时就不需要入栈出栈。我在实际观测流水灯时,发现当做宏处理时的程序相对于被调用的程序的执行速度是快很多的。                                                                                                                            由此,我认为编程时,对于速度要求高的场合,是可以多利用宏替换来代替函数调用。

 

posted on 2013-09-28 19:23  amanlikethis  阅读(1621)  评论(0编辑  收藏  举报