OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4694|回复: 3

关于函数的返回值是局部变量问题

[复制链接]

119

主题

439

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1185
金钱
1185
注册时间
2015-9-18
在线时间
422 小时
发表于 2016-2-2 16:49:28 | 显示全部楼层 |阅读模式
7金钱
小弟最近在纠结函数的返回值是局部变量的问题,看了网上大神的解答,主要有如下2个说法:
说法1>被调用函数的返回值是存放在栈中,退出被调用函数时,这个栈消失,但是值被拷贝一份,然后传给调用函数
说法2>调用函数和被调用函数共享同一个栈内存(被调用函数是调用函数内部的一个语句),所以,当退出被调用函数后,这个局部变量的栈内存没有消失,直到这个调用函数结束才退出.
请问大神:
问题1>如果说法1>成立,那么被拷贝的这个值是存放在哪里?CPU通用寄存器中,普通内存中?还是要看编译器的实现?
问题2>如果说法2>成立,那么假如这个调用函数也是main()函数的一个语句,那是不是说所有程序段都是共享一个栈内存(main()函数的栈内存)?似乎很矛盾啊?

电子爱好者
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

9

主题

538

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3371
金钱
3371
注册时间
2015-1-7
在线时间
794 小时
发表于 2016-2-2 22:17:48 | 显示全部楼层
本帖最后由 ianhom 于 2016-2-2 22:21 编辑

个人觉得说法1靠谱点,我平时使用的情况是子函数在执行完成,返回值是放到通用寄存器Rx中,举个例子u8Temp = Test1();,如果你看函数调用后的汇编的话,你会发现在退出函数后,还有个语句就是把这个Rx的值放到u8Temp。没有详细深入过,我觉得这个是编译器实现有关,楼主可以考虑在不同编译器不同编译优化等级下做几个试验。

对于说法2,这个子函数更像是宏函数或内联函数(inline),这时子函数就是相当于上层函数的一部分语句,这时就不会有压栈出栈等操作,这样的话子函数的局部变量就相当于上层函数的局部变量,在上层函数运行结束后失效。
回复

使用道具 举报

34

主题

805

帖子

4

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1863
金钱
1863
注册时间
2011-3-29
在线时间
139 小时
发表于 2016-2-3 00:33:53 来自手机 | 显示全部楼层
你可以按照说法2来理解,不过对于RISC处理器(比如arm)来说,上述表述是不准确的。由于RISC有比较多的寄存器,编译器会对程序进行优化,一般是规定R0寄存器用于保存返回值,而不是保存在栈中,这样可以提高程序执行的效率。
学一门汇编语言还是有必要的,可以了解到程序的本质。
回复

使用道具 举报

119

主题

439

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1185
金钱
1185
注册时间
2015-9-18
在线时间
422 小时
 楼主| 发表于 2016-2-13 11:25:38 | 显示全部楼层
两位大神的看法不一样啊...这让小弟情何以堪~~~
小弟汇编看不懂,不知道大神有没有好的学习资料或者书籍推荐下(我使用的stm32单片机,属于ARM)
电子爱好者
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-26 03:39

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表