C/C++编译器提供了不同的优化选择,通过修改cl55命令行中的-on选择就可以方便地选择不同的优化等级,n代表优化等级,包括0、1、2和3。下面给出不同优化等级的功能。
1)_00
简化控制流图; 把变量分配到寄存器 ; 分析循环的各种情况,只保留一个退出循环的分支; 删除未用的代码; 简化表达式和声明; 把用inline声明的函数变为调用关系.
2)_01
除了00的各种优化功能外,还有如下功能:
在分配变量时,将数值直接赋给变量而不是给出变量的索引值; 去掉没有用的分配变量和表达式; 去掉本地通用表达式.
3)_02
除了01的各种优化功能外,还有如下功能:
完成循环优化; 去掉全局通用的子表达式; 去掉全局没有用的分配变量和表达式;完成循环的化解 ; 当只用-o选项时优化器自动进行_02优化.
4)_03
除了02的各种优化功能外,还有如下功能:
?去掉未调用的函数; 简化返回值未使用的函数; 将小函数进行内嵌调用; 对被调用的函数声明进行重新排序,以便被优化的调用方能够找到该函数; 完成文件级优化. 优化器分析数据流时将尽量减少对内存的访问,如果这个数据必须从内存中得到,则该数据必须用volatile关键字定义,这样可以使编译器不对该变量进行优化。
例如声明一个指针
unsigned int *ctrl;
当在循环中有如下语句时
while (*ctrl != 0xFF);
优化器将只在进入循环的初始化中进行一次内存读,而在循环当中不再更新该变量的内容,如果该变量被中断或其他程序改变,由于循环中的ctrl的值没有更新,将会使程序不能按照正确的方式执行,这里应当用如下方法声明ctrl:
volatile unsigned int *ctrl;
特别当该变量在中断函数中被赋值,而该变量在主函数的循环中被用到时,必须用volatile声明该变量。 |