请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

函数调用,栈空间

函数调用时,原先函数中所有的局部量都会被压进栈空间吗?

正在回答 回答被采纳积分+3

1回答

quickzhao 2020-09-02 13:59:33

不是。如果用完就毁的变量没有必要保存,如果需要保存现场以便返回使用的变量可以压栈处理,如果是需要传递的参数也可以采用寄存器传递。

0 回复 有任何疑惑可以回复我~
  • 提问者 云清7682379 #1
    例如这段代码:
    int vsimpleFunc(int a) {
    	int value = a;
    	value += 0x33;
    	return value;
    }
    int main()
    {
    	int tmp = 0x22;
    	int tmp2 = 0;
    	int tmp3 = 0x99;
    
    	tmp2 = vsimpleFunc(tmp);
    
    	tmp = tmp3 + 0x11;
    
    	cout << "tmp = " << tmp << endl;
    	cout << "tmp2 = " << tmp2 << endl;
    
    	return 0;
    }
    其中的tmp2和tmp3都没见到压入栈空间。
    因为我进入vsimpleFunc函数后在VS里手动修改了tmp2,tmp3内存中的值,并没有在调用函数恢复时恢复原先的值。且汇编代码里也没看到相关的压栈操作。所以请教下这个问题。
    回复 有任何疑惑可以回复我~ 2020-09-02 15:33:33
  • quickzhao 回复 提问者 云清7682379 #2
    不知道你的目的是什么。这里为什么要压栈,你也没有传参tmp2和tmp3的操作,一般出现压栈是为了保证在调用其他函数时本地现场不被破坏,你这里没有必要压栈。咋们学习最好有个现实的场景,尽量别钻这种牛角尖,而且我们这里学习汇编的主要目的是更好的理解C++底层的一些运作,了解一些常用的场景就可以了。
    回复 有任何疑惑可以回复我~ 2020-09-02 23:06:15
  • 提问者 云清7682379 回复 quickzhao #3
    我又看了两遍视频,发现是我理解错了。这里的压栈是为了函数值传递,不传递的值是存在于本身函数栈区间中,是不用压栈的。谢谢老师解答?
    回复 有任何疑惑可以回复我~ 2020-09-03 00:16:48
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信