返回首页
当前位置: 主页>开发编程语言>

return X 的实现

时间:2008-03-30 00:00来源:亚洲互联网 作者:伟大的中国程序员 点击:

   您正在看的C语言教程是:return X 的实现。相信很多学C/C 语言的兄弟并没有搞清象return X 这样的语句是怎么实现的。
如果你也像我一样,眼睛里容不得半点沙,那么,这篇文章就是为你所写的。

相信很多学C/C 语言的兄弟并没有搞清象return X 这样的语句是怎么实现的。
如果你也像我一样,眼睛里容不得半点沙,那么,这篇文章就是为你所写的。

情况一:X是一简单类型
文件t.c内容如下:
int f(int a)
{
return a ;
}

int main()
{
int v = 1;
f(v);
return 0;
}
一般情况这种写法在c语言中其实没有任何意义,看一下转化成汇编的结果(用命令gcc -S t.c)
1 .file "t.c"
2 .text
3 .globl f
4 .type f, @function
5 f:
6 pushl 雙
7 movl %esp, 雙
8 movl 8(雙), 陎
9 incl 8(雙)
10 popl 雙
11 ret
12 .size f, .-f
13 .globl main 织梦内容管理系统
14 .type main, @function
15 main:
16 pushl 雙
17 movl %esp, 雙
18 subl , %esp
19 andl $-16, %esp
20 movl , 陎
21 addl , 陎
22 addl , 陎
23 shrl , 陎
24 sall , 陎
25 subl 陎, %esp
26 movl , -4(雙)
27 movl -4(雙), 陎
28 movl 陎, (%esp)
29 call f
30 movl , 陎
31 leave
32 ret
33 .size main, .-main
34 .ident "GCC: (GNU) 4.0.0 (Gentoo Linux 4.0.0)"
35 .section .note.GNU-stack,"",@progbits
我们看函数f的实现。第八行把形参的值赋给寄存器陎,linux下的AT&T汇编规定陎中的内容是函数的返回值,这样就相当于直接把形参的返回了。而第九行的指令根本就没有作用,因为函数的形参是局部的auto变量,在函数的运行栈上分配空间。这样,即使在函数f中改变了形参的值,当函数返回后,这次改变就没有意义了。 本文来自织梦
可以看到,如果用-O优化的话,第九行的指令就被优化掉了。
命令gcc -S -O3 t.c的结果如下
1 .file "t.c"
2 .text
3 .p2align 4,,15
4 .globl f
5 .type f, @function
6 f:
7 pushl 雙
8 movl %esp, 雙
9 movl 8(雙), 陎
10 popl 雙
11 ret
12 .size f, .-f
13 .p2align 4,,15
14 .globl main
15 .type main, @function
16 main:
17 pushl 雙
18 xorl 陎, 陎
19 movl %esp, 雙
20 subl , %esp
21 andl $-16, %esp
22 subl , %esp
23 leave
24 ret
25 .size main, .-main
26 .ident "GCC: (GNU) 4.0.0 (Gentoo Linux 4.0.0)"
27 .section .note.GNU-stack,"",@progbits
看到没有,函数f的核心指令就剩下一条了,刚才的那条没有用的指令就被优化掉了。 织梦内容管理系统
管中窥豹,可见一斑。我之所以把整个结果再次帖出来,就是为了让兄弟们看一下,编译器的优化效果有多么强!原来很烦琐的指令,一下就变得简单明了了,优化后程序的执行速度当然就可想而知了:)

情形二:X是指针类型
这种情况就比原来要复杂一点点了,源程序改为如下形式:
#include

int f(int *a)
{
return (*a) ;
}

int main()
{
int v = 1;
f(&v);
return 0;
}

$ gcc -S -O3 t.c后的结果为:
1 .file "t.c"
2 .text
3 .p2align 4,,15
4 .globl f
5 .type f, @function
6 f:
7 pushl 雙
8 movl %esp, 雙
9 movl 8(雙), 韝 #取形参,第N个形参在栈上的位置为(N 1)*4 雙
10 movl (韝), 陎 #把形参指向的地址单元的值赋给陎
11 leal 1(陎), 靫 #把陎中的值加1后赋给靫
12 movl 靫, (韝) #运算结果写回形参指向的单元,即完成了(*a)

织梦好,好织梦

13 popl 雙
14 ret
15 .size f, .-f
16 .p2align 4,,15
17 .globl main
18 .type main, @function
19 main:
20 pushl 雙
21 xorl 陎, 陎
22 movl %esp, 雙
23 subl , %esp
24 andl $-16, %esp

内容来自dedecms

您正在看的C语言教程是:return X 的实现。25 subl , %esp
26 leave
27 ret
28 .size main, .-main
29 .ident "GCC: (GNU) 4.0.0 (Gentoo Linux 4.0.0)"
30 .section .note.GNU-stack,"",@progbits

其实也不是很麻烦。函数f的核心语句只有四条指令,看上面的注释就行了。
如果没有看汇编结果,有的兄弟一定会犯糊涂了:为什么函数返回了还能有效改变变量的值?
看了汇编就一清二楚了:其实变量的值仍然是在函数体中改变的,只不过返回的值和改变的值没有什么必然的联系而已。


如果不加优化参数,函数f转化的汇编的结果如下,晦涩多了吧

5 f:
6 pushl 雙
7 movl %esp, 雙
8 movl 8(雙), 陎 #取形参
9 movl (陎), 陎 #取形参所指向的地址单元的值
10 movl 陎, 靫 #保存陎的副本
11 leal 1(陎), 韝 #把陎中的值加1后放入韝
12 movl 8(雙), 陎 #再次取形参,下一步用
13 movl 韝, (陎) #把韝的值存入陎指向的单元,即完成了(*a)
织梦内容管理系统

14 movl 靫, 陎 #恢复陎的值。再次强调,函数的返回值保存在陎中
15 popl 雙
16 ret





秦华 『上海买保险』上海地区人寿保险资深寿险顾问 上海外籍人士买保险-高端人士医疗办理
服务项目:儿童医疗/子女教育金/养老保险/重大疾病/意外伤害/员工团险/公众责任
免费热线『上海』:13761630213, QQ:107242375, Email:victor.qin@qq.com
选择保险事业 为了爱,为了一份坚定的承诺!MSN:
上海地区请直接拨打本人电话,应约免费上门提供免费保险方案。
Baoxian.ws>>           旅行签证保险、上门办理>>        重大疾病网>>     上海重大疾病一览    
友情链接: 走在上海人寿保险的前端    和讯保险博客    上海投保在线    Shanghai Insurance    秦华的个人简历


顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
图文并茂 我的链接
最新评论 查看所有评论
发表评论 查看所有评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 密码: 验证码:
上海高端医疗/住院医疗保险信息
上海保险规划师信息
上海子女教育理财保险信息
上海保险规划师信息
上海女性高端生育保险方案-等待期
上海保险规划师信息
上海三口之家家庭保障方案
上海保险规划师信息
上海女性特色重大疾病保险方案
上海保险规划师信息
上海女性白领理财保险方案
上海保险规划师信息
上海养老理财规划保险方案
上海保险规划师信息
通过网络取得初步咨询
  •    
上海办理-免费咨询送计划书
上海买保险
上海办理-申根签证 出国旅行保险
上海买保险
上海买保险,海外基金,买保险,友邦保险,中国人民健康保险,养老保险,儿童保险,儿童医疗,子女教育金,太平洋保险,医疗保险,工伤保险条例,中国人寿保险,保险公司,中国平安保险,医疗险,进口药,自费药,外籍人士医疗,泰康人寿,英国保诚集团,上海综合保险,国际医疗保险,上海医疗保险,上海社会保险,上海养老保险,上海市综合保险,上海平安保险,上海太平洋保险,和睦家医院,上海综合保险卡,买保险,高端医疗,重大疾病,意外伤害,定期寿险,家庭理财,友邦保险,金茂大厦,少儿互助基金,上海社保,太平洋集团,港安医院