C/C++代码优化方法

优化概述

如果将未经优化的C语言程序直接运行会发现运行效率较低,并且产生的代码较大,而通过优化可以较好地解决这些问题。

优化的作用是对循环进行化简,重新组织表达式和声明,将变量直接分配到寄存器中。

通过优化可以提高程序运行效率,缩小程序编码数量。

C/C++编译器提供了不同的优化选择,通过修改cl55命令行中的-on选择就可以方便地选择不同的优化等级,n代表优化等级,包括0、1、2和3。下面给出不同优化等级的功能。

_O0优化

1、 简化控制流图
2、把变量分配到寄存器
3、分析循环的各种情况,只保留一个退出循环的分支
4、删除未用的代码
5、简化表达式和声明
6、把用inline声明的函数变为调用关系

_O1优化

除了O0的各种优化功能外,还有如下功能:
1、在分配变量时,将数值直接赋给变量而不是给出变量的索引值
2、去掉没有用的分配变量和表达式
3、去掉本地通用表达式

_O2优化

除了O1的各种优化功能外,还有如下功能:
1、完成循环优化
2、去掉全局通用的子表达式
3、去掉全局没有用的分配变量和表达式
4、完成循环的化解
5、当只用-O选项时优化器自动进行-O2优化

_O3优化

除了O2的各种优化功能外,还有如下功能:
1、去掉未调用的函数
2、简化返回值未使用的函数
3、将小函数进行内嵌调用
4、对被调用的函数声明进行重新排序,以便被优化的调用方能够找到该函数
5、完成文件级优化

volatile关键字避免优化

优化器分析数据流时将尽量减少对内存的访问,如果这个数据必须从内存中得到,则该数据必须用volatile关键字定义,这样可以使编译器不对该变量进行优化。
例如声明一个指针

unsigned int *ctrl; 

当在循环中有如下语句时

while (*ctrl != 0xFF);

优化器将只在进入循环的初始化中进行一次内存读,而在循环当中不在更新该变量的内容,如果该变量被中断或其他程序改变,由于循环中的ctrl的值没有更新,将会使程序不能按照正确的方式执行,这里应当用如下方法声明ctrl:

volatile unsigned int *ctrl;

特别当该变量在中断函数中被赋值,而该变量在主函数的循环中被用到时,必须用volatile声明该变量。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

拾牙慧者

欢迎请作者喝奶茶

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值