新闻中心

EEPW首页>嵌入式系统>设计应用> 高效的C编程之: 函数调用

高效的C编程之: 函数调用

作者: 时间:2013-09-30 来源:网络 收藏

本文引用地址://m.amcfsurvey.com/article/257016.htm

14.9.2使用返回结构体

编译选项指示编译器在整数寄存器中返回4个整数字的结构或者在浮点寄存器中返回4个浮点型或双精度型值,而不使用存储器。

下面的例子显示了选项的用法。

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进行内联。



评论


相关推荐

技术专区

关闭