zoukankan      html  css  js  c++  java
  • arm-linux-gcc中对“inline”的处理

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

     

  • 相关阅读:
    python 基础知识(一)
    挖坑和打井的思考
    静坐冥想
    恭喜你被裁员了!
    什么叫做内心强大?怎样变成一个内心强大的人?
    年轻人,你的时间到哪啦?
    树莓派3B+ 人脸识别、摄像头安装和使用
    树莓派3b+ 实现视频监控
    如何设置树莓派 VNC 的分辨率
    为什么大多数托管辅导班做不大?
  • 原文地址:https://www.cnblogs.com/amanlikethis/p/3344561.html
Copyright © 2011-2022 走看看