高效的C编程之: 函数调用
14.9.2使用__value_in_regs返回结构体
编译选项__value_in_regs指示编译器在整数寄存器中返回4个整数字的结构或者在浮点寄存器中返回4个浮点型或双精度型值,而不使用存储器。
下面的例子显示了__value_in_regs选项的用法。
typedefstruct{inthi;uintlo;}int64;//注意该结构中,高位为有符号整数,低位为无符号整数
__value_in_regsint64add64(int64x,int64y)
{int64res;
res.lo=x.lo+y.lo;
res.hi=x.hi+y.hi;
if(res.loy.lo)res.hi++;//carryfromlowword
returnres;
}
voidtest(void)
{int64a,b,c,sum;
a.hi=0x00000000;a.lo=0xF0000000;
b.hi=0x00000001;b.lo=0x10000001;
sum=add64(a,b);
c.hi=0x00000002;c.lo=0xFFFFFFFF;
sum=add64(sum,c);
}
编译后的结果如下所示。
add64
ADDSa2,a2,a4
ADCa1,a3,a1
MOVpc,lr
test
STMDBsp!,{lr}
MOVa1,#0
MOVa2,#f0000000
MOVa3,#1
MOVa4,#10000001
BLadd64
MOVa3,#2
MVNa4,#0
LDMIAsp!,{lr}
Badd64
当使用__value_in_regs定义结构体时,编译的代码大小为52字节,如果不使用__value_in_regs选项,则编译出的结果为160字节(本书中没有列出未使用__value_in_regs时的编译结果,读者有兴趣可以自己上机试验)。
14.9.3叶子函数
所谓叶子函数(leaffunction)就是在其函数体内不存在对其他函数调用,它也常被称为终级函数。因为叶子函数不需要调用其他函数,所有没有保存/恢复寄存器的操作,因此执行效率比一般函数要高。
当函数中必须对一些寄存器进行保存时,可以使用高效率的多寄存器存储指令STM,对需要保存的寄存器内存一次性存储。
正是由于叶子函数执行的高效性,所以在编程时,尽量将子程序编写为叶子函数,这样即使程序中多次调用也不会影响代码性能。
为了高效的调用函数,可以遵循下面函数调用原则。
·避免在被频繁调用的函数中调用其他函数,以保证被频繁调用的函数被编译器编译为叶子函数。
·把比较小的被调用函数和调用函数放在同一个源文件中,并且要先定义后调用,编译器就可以优化函数调用或内联较小的函数。
·对性能影响较大的重要函数可使用关键字_inline进行内联。
评论