ARM的C语言程序优化

2007-1-25 19:07:00 ARM的C语言程序优化

  • 数据类型
    • 存放在寄存器中的局部变量(尤其是循环变量)应尽可能使用32位数据类型int(=long),8位变量不节省任何空间和时间;
    • 即使传输一个8位数据,函数参数和返回值使用32位类令会更有效;
    • 能用指针递增寻址就不用数组下表递增寻址a=data[i++]不如a=*(data++);
    • 除法运算使用无符号数更快;
    • 存放在存储器中的数组和全局变量,尽可能使用小尺寸数据类型;
    • short型数组尽量避免使用数组基地址的偏移量,因为LDRH指令不支持偏移寻址;
    • 存储器变量和寄存器变量相互赋值时使用显式类型转换,其他情况下避免不必要的类型转换;
  • 循环结构
    • 采用减计数循环比增计数循环更好,终止条件尽量写 i != 0 ;循环变量起始值是变量且不等于0的情况下用do-while循环更优(终止条件在后);
    • 若循环体过于简单,比如少于4个周期,可展开循环体(重复写几遍循环体代码),以免循环体代码还不如循环本身执行周期长;
    • 尽量限制函数内部循环所用局部变量的数据,最多不要超过12个,这样编译器就可以把他们都分配给ARM寄存器;
  • 函数调用
    • 尽量限制函数的参数,不要超过4个。可以将几个相关参数组织在一个结构体中;
    • 把较小的被调函数和调用函数放在一个文件中,并先定义再调用;
    • 对性能影响较大的重要函数可使用_inline进行内联;
  • 指针别名
    • 建立一个新的局部变量来保存包含存储器访问的表达式,这样可以保证只对这个表达式求一次值,例如int a=data[n];b+=a;c+=a; 比b+=data[n];c+=data[n];好
    • 避免使用局部变量的地址,否则对这个变量的访问效率会比较低;
  • 结构体安排
    • 结构体元素要按照元素从小到大排序;
    • 避免使用很大的结构体,可以用层次化的小结构体来代替;
【ARM的C语言程序优化】注:针对ARMv4以上版本

    推荐阅读