高效的C编程之:C编译器及其优化
在代码重排),产生的结果如下所示。
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
从上面的例子可以看出在使用内嵌功能时,函数间的相互调用减少了数据的压栈和出栈,节省了程序的执行时间,但如果内嵌函数被调用多次会造成空间的浪费。
- Linux下C编程基础之:常用编辑器(08-13)
- Linux下C编程基础之:gcc编译器(08-13)
- Linux下C编程基础之:gdb调试器(08-13)
- Linux下C编程基础之:make工程管理器(08-13)
- Linux下C编程基础之:使用autotools(08-13)
- Linux下C编程基础之:实验内容(08-13)