堆栈(栈,Stack)?????

aaassd 2003-12-16 07:01:36
堆栈(栈,Stack)是操作系统为每一个运行的线程分配的内存空间,用来保存函数调用的现场、参数、返回值、变量的值。堆栈创建以后大小固定。
在函数里用到局部变量的时候,是通过栈地址+偏移吗?
它把这两个地址保存在哪里呢,用的时候就可以找到呢?
如果变量多了呢?
...全文
51 15 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
dindon 2003-12-18
  • 打赏
  • 举报
回复
谁能回答一下我的那个菜鸟问题啊?!我记得对否?
AllanJD 2003-12-17
  • 打赏
  • 举报
回复
搬个板凳,学习一下。

-_-!
aaassd 2003-12-17
  • 打赏
  • 举报
回复
源程序编译成可执行文件后,各个函数中每个局部变量相对于栈指针的编译就已经固定了
所以到时候只需一个寄存器保存机制就可以了

我就是想知道这里是怎么实现的?
谢谢楼上的回答,分不是问题,我可以再开贴.
FrankZhang123 2003-12-17
  • 打赏
  • 举报
回复
int f()
{
int a1;
int a2;
int a3;
return 100;
}
=>
f()
{
保存当前栈指针寄存器ESP
EBP=ESP
于是&a1=EBP,&a2=EBP+4,&a3=EBP+8
这是根据定义变量的顺序算出来的
...
EAX=100,设置返回值
ret




aaassd 2003-12-17
  • 打赏
  • 举报
回复
那我的问题还是没有结果.
dindon 2003-12-17
  • 打赏
  • 举报
回复
base就是栈的基地址
aaassd 2003-12-17
  • 打赏
  • 举报
回复
那我问一下吧base是什么呢?
dindon 2003-12-17
  • 打赏
  • 举报
回复
好像编译原理里面有个什么表吧,好像可以保存比如局部变量对应的偏移量什么的。请高手回答是不是酱紫的捏?(我是菜鸟,说错了指出来就好了,千万不要骂啊^_^)
hanyixin 2003-12-17
  • 打赏
  • 举报
回复

已经有一个指针指向Base了的,那个4是编译器分配好的,表示在偏移为4的那个地址上放的是 a 。
aaassd 2003-12-17
  • 打赏
  • 举报
回复
谢谢
这个可以理解,但我想问的是:当我用到a它是如何找到[Base+4]的?
hanyixin 2003-12-17
  • 打赏
  • 举报
回复

是减不是加,失败 :(

hanyixin 2003-12-17
  • 打赏
  • 举报
回复

|Base|
| a |
| b |
| c |

象这样,abc的位置都是固定好了的,函数执行的时候,有一个指针指向Base那个地方,所以[Base+4]就是a,[Base+8]就是b。



aaassd 2003-12-17
  • 打赏
  • 举报
回复
a+b*c;(每个都有值)
这里的a,b,c是内存中的三个数.
如果是汇编计算这个,我们事先要知道a,b,c三个数的地址.

如果是在c++中(局部变量考虑)a=1;b=2;c=4;
d=a+b*c;三个数是在临时调用函数时
分配的地址.也就是在栈里的位置.当执行到d=a+b*c时怎么找到具体的位置呢?
也就是说编译器见到c就知道到c的位置去取值,这个过程是怎么实现的呢?
robertcarlos 2003-12-16
  • 打赏
  • 举报
回复
steedhorse(晨星)好久不见,你还是那样的厉害~
晨星 2003-12-16
  • 打赏
  • 举报
回复
源程序编译成可执行文件后,各个函数中每个局部变量相对于栈指针的编译就已经固定了。
所以到时候只需一个寄存器保存机制就可以了。
你所谓变量“多”到底是多少?几兆个?还是几吉个?反正多到一定程度,超过了栈的大小,总归会溢出的。
退一万步说,你的内存是有限的,而且CPU的取址空间也是有限的。

65,186

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧