高效的C编程之: 函数调用
BL _dflt
LDMIA sp!,{lr}
B sqrt
使用函数内嵌有以下好处:
· 减少了函数调用开销(如寄存器的压栈保护);
· 减少了参数传递开销;
· 进一步提高了编译器对代码优化的可能性(如编译器可将ADD和MUL指令合并为一条MLA指令)。
但使用函数内嵌将增加代码尺寸。也正是处于这种原因,armcc和tcc都没有提供函数自动内嵌的编译选项。
一般来说,只有对性能影响较大的重要函数才使用关键字_inline进行内嵌。
14.9.7 函数定义
使用函数时要先定义后调用是ARM编程的基本规则之一。在函数调用之前定义函数,编译器可以检查被调用函数的寄存器使用情况,从而对其进行进一步的优化。
首先来看下面的例子。
int square(int x);
int sumsquares1(int x, int y)
{
return square(x) + square(y);
}
/* square函数可以在本文件中定义,也可以在其他源文件中定义 */
int square(int x)
{
return x * x;
}
int sumsquares2(int x, int y)
{
return square(x) + square(y);
}
编译的结果如下所示。
sumsquares1
STMDB sp!,{v1,v2,lr}
MOV v1,a2
BL square
MOV v2,a1
MOV a1,v1
BL square
ADD a1,v2,a1
LDMIA sp!,{v1,v2,pc}
square
MOV a2,a1
MUL a1,a2,a2
MOV pc,lr
sumsquares2
STMDB sp!,{lr}
MOV a3,a2
BL square
MOV a4,a1
MOV a1,a3
BL square
ADD a1,a4,a1
LDMIA sp!,{pc}
从编译的结果可以看出,将square函数定义放在sumsquares函数前,编译器可以判断寄存器a3和a4并未使用,所有在调用函数入口处并未将其压栈。这样,减少了内存访问,提高了代码执行效率。
C编程 函数调用 ARM __value_in_regs 相关文章:
- 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)