小弟最近在纠结函数的返回值是局部变量的问题,看了网上大神的解答,主要有如下2个说法:
说法1>被调用函数的返回值是存放在栈中,退出被调用函数时,这个栈消失,但是值被拷贝一份,然后传给调用函数
说法2>调用函数和被调用函数共享同一个栈内存(被调用函数是调用函数内部的一个语句),所以,当退出被调用函数后,这个局部变量的栈内存没有消失,直到这个调用函数结束才退出.
请问大神:
问题1>如果说法1>成立,那么被拷贝的这个值是存放在哪里?CPU通用寄存器中,普通内存中?还是要看编译器的实现?
问题2>如果说法2>成立,那么假如这个调用函数也是main()函数的一个语句,那是不是说所有程序段都是共享一个栈内存(main()函数的栈内存)?似乎很矛盾啊?
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
个人觉得说法1靠谱点,我平时使用的情况是子函数在执行完成,返回值是放到通用寄存器Rx中,举个例子u8Temp = Test1();,如果你看函数调用后的汇编的话,你会发现在退出函数后,还有个语句就是把这个Rx的值放到u8Temp。没有详细深入过,我觉得这个是编译器实现有关,楼主可以考虑在不同编译器不同编译优化等级下做几个试验。
对于说法2,这个子函数更像是宏函数或内联函数(inline),这时子函数就是相当于上层函数的一部分语句,这时就不会有压栈出栈等操作,这样的话子函数的局部变量就相当于上层函数的局部变量,在上层函数运行结束后失效。
一周热门 更多>