arm-linux-gcc中对“inline”的处理

本文深入分析了ARM Linux GCC编译器如何处理C语言中的inline关键字,通过对比实验展示了其与C++编译器处理方式的不同,并探讨了inline关键字在提高程序执行速度方面的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

   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()函数就当做一个宏展开,这时就不需要入栈出栈。我在实际观测流水灯时,发现当做宏处理时的程序相对于被调用的程序的执行速度是快很多的。                                                                                                                            由此,我认为编程时,对于速度要求高的场合,是可以多利用宏替换来代替函数调用。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值