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