历史上的今天
返回首页

历史上的今天

今天是:2025年03月30日(星期日)

正在发生

2021年03月30日 | 高效的C编程之:C编译器及其优化(中)

2021-03-30 来源:eefocus

2.冗余代码的清除


下面例子显示了一段急待优化的代码。


intdummy()


{


inta=10,b=20;


intc;


c=a+b;


return0;


}


当使用arm–c–O0进行编译时,产生的汇编码如下所示。


dummy:


0000807CE3A0100AMOV r1,#0xa


>>>REDUNDANT#3inta=10,b=20;


00008080E3A02014MOV r2,#0x14


>>>REDUNDANT#5c=a+b;


00008084E0813002ADD r3,r1,r2


>>>REDUNDANT#6return0;


00008088E3A00000MOV r0,#0


>>>REDUNDANT#7}


0000808CE12FFF1EBX r14


从上面的汇编输出可以看到,编译器并没有对程序中的冗余变量做任何工作。但上面这段代码在编译时,编译器会给出警告,警告信息如下所示。


Warning:#550-D:variable"c"wassetbutneverused


Redundant.cline4intc;


但如果将编译器的优化级别提高,如使用arm–c–O1命令,则编译器输出的汇编代码如下所示。


dummy:


0000807CE3A00000MOVr0,#0


>>>REDUNDANT#7}


00008080E12FFF1EBXr14


从上面的例子看出,当优化级别提高到-O1时,程序中的冗余变量就会被清除。


3.指令重排


当指定编译器对程序代码进行优化时,编译器会对程序中排列不合理的汇编指令序列进行重排(只有在-O1及其以上的优化级别中才有),重排的目的是为了减少指令互锁(interload)。所谓互锁就是指如果一条指令需要前一条指令的执行结果,而这时结果还没有出来,那么处理器就会等待。这被称为流水线冒险(pipelinehazard),也被称为流水线互锁。


下面例子显示了对同一程序使用代码重排和不使用代码重排所产生的汇编码的区别。÷


程序的源代码如下所示。


intf(int*p,intx)


{return*p+x*3;}


使用-O0选项对代码进行编译(无代码重排),产生的结果如下所示。


ADDr1,r1,r1,LSL#1


LDRr0,[r0,#0]


ADDr0,r0,r1 ;ARM9上产生互锁


MOVpc,lr


使用-O1选项对代码进行编译(存在代码重排),产生的结果如下所示。


ADDr1,r1,r1,LSL#1


ADDr0,r0,r1


MOVpc,lr


指令重排发生在寄存器定位和代码产生阶段。代码重排只对ARM9及其以后的处理器版本产生作用。当使用代码重排时,代码的执行速度平均提供4%。可以使用-zpno_optimize_


scheduling编译选项关闭代码重排。


4.内嵌函数


通常情况下,如果不指定编译选项,编译器会将一些代码量小且调用次数少的函数内嵌进调用函数中。如果某段子程序在其他模块中没有被调用,请使用Static关键字将其标识。


编译选项的--autoinline和--no_autoinline可以作为内嵌函数的使能开关。--no_autoinline选项为-O0和-O1选项的默认选项,但如果指定-O2或-O3的优化选项,编译器将默认使用--autoinline选项。


有关内嵌函数的详细信息,请参见本书内嵌函数一节。


推荐阅读

史海拾趣

联智(Celfras)公司的发展小趣事

作为江西省首家提供高端应用芯片整体解决方案的公司,联智在集成电路设计领域展现了其强大的实力。公司不仅关注无线充电技术,还致力于电源管理、低功耗蓝牙、近场感应等IoT(物联网)应用芯片的研发和产业化。这种多元化的产品策略使联智能够满足不同客户的需求,进一步巩固了其在市场中的地位。

Daykin Electric Corp公司的发展小趣事

随着公司实力的不断增强,大金开始将目光投向国际市场。1972年,“DaikinEuropeN.V”在比利时奥斯坦斯市成立,标志着大金正式进入欧洲市场。此后,大金通过不断的技术创新和市场拓展,逐渐在全球范围内建立了广泛的销售网络。

AIM公司的发展小趣事

AIM公司深知质量是企业的生命线。因此,公司始终将质量管理放在首位,建立了严格的质量控制体系。从原材料采购到产品出厂,每一个环节都经过严格把关,确保产品的质量稳定和可靠。同时,AIM还注重品牌建设,通过提供优质的产品和服务,树立了良好的品牌形象和口碑。

Galaxy Microelectronics公司的发展小趣事

深圳市飞翼科技有限公司自2006年成立以来,一直致力于模拟与数字MCU混合芯片领域的研究、设计和开发应用。公司主攻电容式触摸感应按键芯片设计,凭借多项独有的专利技术,成功突破了行业内的技术难点。经过多年的努力,飞翼科技已成为该应用领域中技术最全面、市场份额最大的公司之一。其电容式触摸感应芯片广泛应用于各类电子产品中,为用户带来了更加便捷、智能的交互体验。

骅讯(Cmedia)公司的发展小趣事

进入21世纪后,随着USB技术的普及,骅讯公司迅速抓住市场机遇,进军USB音频业务。凭借其在音频技术领域的深厚积累,骅讯成功开发出多款USB音频产品,并在市场上取得了良好的反响。这一举措不仅拓展了骅讯的业务范围,也为其在音频领域的持续发展奠定了坚实的基础。

Electronic Transistors Corp公司的发展小趣事

在技术创新的基础上,ETC公司开始积极拓展市场。公司通过优化产品线,满足不同客户的需求,逐渐打开了国际市场的大门。同时,ETC还加大了品牌宣传力度,通过参加国际电子展会、发布技术白皮书等方式,提升品牌知名度和影响力。这些举措使ETC在全球范围内的市场份额不断扩大,品牌影响力也日益增强。

问答坊 | AI 解惑

发一个<<DSP易学通>>书籍所带源码

发一个书籍所带源码,供学习者参考!…

查看全部问答>

单片机工具自制系列2

自制K149BC PIC专用USB接口编程器的完整资料…

查看全部问答>

安装ActiveSync4.5时,总出现问题

安装到,复制新文件的时候,出现 错误。写入文件C:\\WINDOWS\\system32\\rapi.dll 时出错。 请验证您有权访问该目录。 之前也装过 ActiveSync4.5 但是没有出现问题,该怎么解决啊?? 谢谢大家了!!…

查看全部问答>

有谁divxdec.ax组建??

请问:在WINCE里能否用divxdec.ax组建,如果可以那么该怎么在WINCE里注册???谢谢~~…

查看全部问答>

十万火急,,哪个点下????原因

ORG 0000H AJMP START ORG 30H START: MOV R1,#01HMOV P1,#0FFH ;关所 灯 MOV TMOD,#00000001B ;定时/计数器0工作于方式1 MOV TH0,#15H MOV TL0,#0A0H ;即数5536 SETB TR0 ;定时/计数器0开始运行 LOOP:JBC TF0,NEXT ;如果TF0等于1,则清TF ...…

查看全部问答>

使用STM32关于电压基准的选择问题?

                                 使用100脚的STM32封装,本来使用REF2930做电压基准,近来拿来报价明细一看,原来REF2930一直要二十多块,价格过高 ...…

查看全部问答>

通过模拟开关或者继电器导通电流信号,现有问题,请大家指教

通过模拟开关或者继电器导通电流信号,现有问题,请大家指教 1,如果是模拟开关,漏电流不能恒定,会随着信号的大小变化。以至于信号本来是线性的,结果就非线性了。2,如果是继电器,有声音。有无声的继电器吗? 那种光电转换的继电器也会有漏电 ...…

查看全部问答>

求C2000Lauchpad的规格

现在lauchpad不在身边,要画PCB需要相应参数。最好有文档神马的,原来用游标卡尺测过,数据没有带来……就是J1排针和J5排针,以及J6排针和J5排针之间的距离…

查看全部问答>

软件开发经典书籍推荐(一)---软件开发的科学与艺术

本帖最后由 tiankai001 于 2015-2-27 17:20 编辑 你在自己的学习工作中,能不能跟和你意见不一致的人一起工作,能不能保持一种宽容的心态。因为人与人的思维方式是不一样的,你在你的工作中肯定会遇到与你意见不一致的人,这一点是毫 ...…

查看全部问答>