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

来源:本站
导读:目前正在解读《高效的C编程之: 函数调用(上)》的相关信息,《高效的C编程之: 函数调用(上)》是由用户自行发布的知识型内容!下面请观看由(电工技术网 - www.9ddd.net)用户发布《高效的C编程之: 函数调用(上)》的详细说明。
简介:函数设计的基本原则是使其函数体尽量的小。这样编译器可以对函数做更多的优化。(EEFOCUS)

14.9函数调用

函数设计的基本原则是使其函数体尽量的小。这样编译器可以对函数做更多的优化。

14.9.1减少函数调用开销

ARM上的函数调用开销比非RISC体系结构上的调用开销小:

·调用返回指令“BL”或“MOVpc,lr”一般只需要6个指令周期(ARM7上)。

·在函数的入口和出口使用多寄存器加载/存储指令LDM和STM(Thumb指令使用PUSH和POP)提高函数体的执行效率。

ARM体系结构过程调用标准AAPCS定义了如何通过寄存器传递参数和返回值。函数中的前4个整型参数是通过ARM的前4个寄存器r0、r1、r2和r3来传递的。传递参数可以是与整型兼容的数据类型,如字符类型char、半字类型short等。

注意

如果是双字类型,如longlong型,只能通过寄存器传递两个参数。

不能通过寄存器传递的参数,通过函数堆栈来传递。这样不论是函数的调用者还是被调用者都必须通过访问堆栈来访问参数,使程序的执行效率下降。

下面的例子显示了函数调用是传递4个参数和多于4个参数的区别。

传递4个参数的函数调用源文件如下。

intfunc1(inta,intb,intc,intd)

{

returna+b+c+d;

}

intcaller1(void)

{

returnfunc1(1,2,3,4);

}

编译的结果如下。

func1

ADDr0,r0,r1

ADDr0,r0,r2

ADDr0,r0,r3

MOVpc,lr

caller1

MOVr3,#4

MOVr2,#3

MOVr1,#2

MOVr0,#1

Bfunc1

如果程序需要传递6个参数,变为如下形式。

intfunc2(inta,intb,intc,intd,inte,intf)

{

returna+b+c+d+e+f;

}

intcaller2(void)

{

returnfunc1(1,2,3,4,5,6);

}

则编译后的汇编文件如下。

提醒:《高效的C编程之: 函数调用(上)》最后刷新时间 2024-03-14 01:07:24,本站为公益型个人网站,仅供个人学习和记录信息,不进行任何商业性质的盈利。如果内容、图片资源失效或内容涉及侵权,请反馈至,我们会及时处理。本站只保证内容的可读性,无法保证真实性,《高效的C编程之: 函数调用(上)》该内容的真实性请自行鉴别。