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

     

  • 相关阅读:
    CAFFE安装(3):cuDNN v4
    监测查询性能(1)
    SQL Server 中的三种分页方式
    使用DBCC SHOW_STATISTICS展示索引的统计信息
    查询表的分配单元数据
    Node.js中的事件
    node-mysql中的连接池代码学习
    Excel动态生成JSON
    使用SignalR实现比特币价格实时刷新
    使用Async同步执行异步函数
  • 原文地址:https://www.cnblogs.com/amanlikethis/p/3344561.html
Copyright © 2011-2022 走看看