关于函数返回值的一点思考
2014-09-11 15:04
288 查看
int sum(char *a) { int temp; //计算过程略 return temp; }
想必上面的那个函数是简单的不能再简单的教科书函数了,最近新来一个同事对这个返回temp提出了异议,栈上的资源,函数调用完毕后不是会被系统回收么?虽然这是一个很基础的问题,但一时半会儿也解释不清楚,因为用太多了,根本就不会去对这个提出质疑。对于函数我一直是这么认为的,拿上面的例子,比如int c = sum(s);那么我首先认为sum(s)它只是个值,然后它的具体数据取决于函数过程。好了,言归正传,既然有疑议,那么就深入浅出一下。
有写了如下代码:
#include <stdio.h> int sum(int a,int b) { return a+b; } int main(int argc,char **argv) { int a=0; int b=3; int c = sum(a,b); return 0; }将代码编译成汇编(gcc -S test.c -o test):
.file "test.c" .text .align 2 .global sum .type sum, %function sum: @ args = 0, pretend = 0, frame = 8 @ frame_needed = 1, uses_anonymous_args = 0 @ link register save eliminated. str fp, [sp, #-4]! add fp, sp, #0 sub sp, sp, #12 str r0, [fp, #-8] str r1, [fp, #-12] ldr r2, [fp, #-8] ldr r3, [fp, #-12] add r3, r2, r3 mov r0, r3 //将相加值赋值于r0,r0即为返回值 add sp, fp, #0 ldmfd sp!, {fp} bx lr .size sum, .-sum .align 2 .global main .type main, %function main: stmfd sp!, {fp, lr} add fp, sp, #4 sub sp, sp, #16 mov r3, #0 str r3, [fp, #-8] mov r3, #3 str r3, [fp, #-12] ldr r0, [fp, #-8] ldr r1, [fp, #-12] bl sum str r0, [fp, #-16] //上一过程中bl sum 已经将计算值赋值于r0中了 mov r3, #0 mov r0, r3 sub sp, fp, #4 ldmfd sp!, {fp, pc} .size main, .-main .ident "GCC: (Debian 4.6.3-14+rpi1) 4.6.3" .section .note.GNU-stack,"",%progbits
从上面的汇编语言中可以清晰的看到,c=sum(a+b),先执行sum(a+b)计算得返回值存储于r0,再加r0中的值赋值于c,完成函数调用返回赋值过程。
有些东西太基础了,觉得理所应当,code一下一目了然。
相关文章推荐
- 引用作为函数返回值的一点思考
- 关于jQuery中load函数的一点思考
- 关于函数返回值的设计的一些思考
- 关于函数名与函数指针的一点思考
- 关于qsort第四个参数,函数指针作参数的一点思考
- 关于fork()函数的一点思考
- 关于函数返回值的设计的一些思考
- 关于中断服务函数带来返回值的思考
- 关于栈的弹出函数设计是否应该有两个返回值,一个表示数据,一个表示是否栈为空
- 关于web框架的一点思考
- 关于船舶建造系统的一点思考
- 关于栈的弹出函数设计是否应该有两个返回值,一个表示数据,一个表示是否栈为空
- 关于Windows下ShellCode编写的一点思考
- 关于response.sendRedirect()方法的一点思考
- 关于动态内存的一点思考
- 关于Sqlite数据库二进制数据字段操作方法的一点思考
- 关于栈的弹出函数设计是否应该有两个返回值,一个表示数据,一个表示是否栈为空
- 关于程序设计语言的一点思考
- 关于函数调用中参数传递的一些思考
- 关于datawindow控件,GetChild()函数的一点经验