微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 高效的C编程之:C编译器及其优化

高效的C编程之:C编译器及其优化

时间:08-30 来源:3721RD 点击:

在代码重排),产生的结果如下所示。

ADD r1,r1,r1,LSL #1

ADD r0,r0,r1

MOV pc,lr

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

4.内嵌函数

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

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

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

下面的例子显示了同一段程序,使用内嵌功能和不使用内嵌功能编译出的不同结果。

要编译的源文件如下。

int bar(int a)

{

a=a+5;

return a;

}

int foo(int i)

{

i=bar(i);

i=i-2;

i=bar(i);

i++;

return i;

}

下面的汇编程序为不使用内嵌功能时编译出的结果。

bar

ADD r0,r0,#5

MOV pc,lr

foo

STR lr,[sp,#-4]!

BL bar

SUB r0,r0,#2

BL bar

ADD r0,r0,#1

LDR pc,[sp],#4

下面的汇编码是使用内嵌功能时编译出的结果。

foo

ADD r0,r0,#5

SUB r0,r0,#2

ADD r0,r0,#5

ADD r0,r0,#1

MOV pc,lr

从上面的例子可以看出在使用内嵌功能时,函数间的相互调用减少了数据的压栈和出栈,节省了程序的执行时间,但如果内嵌函数被调用多次会造成空间的浪费。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top