局部变量存储在栈里?

herostarone 2010-12-22 08:44:54
比如:
int main()
{
int i =0;
i++;
}
只知道局部变量,存放在栈里,过了作用域就自动销毁,但是栈是push pop存放的吧,肯定不能把ipush了吧,我感觉应该是把cpu的寄存器push进去,用完后在pop,保护cpu的寄存器,可是如果局部变量太多,得push多少寄存器啊,有点糊涂

而且这个栈是存放cpu的寄存器的那个栈吗?
...全文
504 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
padmepingouin 2010-12-22
  • 打赏
  • 举报
回复
实际上操作系统定义了一个结构体用来存储函数的活动记录 这个结构体的内容就包括了返回地址参数等等
所谓pop或者弹出 就是想我所指的那样 回到原来的地址 如果机器指令执行到b()返回的指令 那么就将跳转到函数返回的地方 就像弹出了b()函数相关的信息一样 其实只是跳转到一个位置 然后程序如果继续执行的话就把原来b()的内容覆盖掉了
herostarone 2010-12-22
  • 打赏
  • 举报
回复
貌似这个栈跟push pop不挂钩啊,你说a b那个例子,b执行完后返回后,栈顶指针自动移动到a的栈顶,是这样的吧,可是他如何知道移动到哪了呢


[Quote=引用 12 楼 padmepingouin 的回复:]

进程空间大约是这样分布的:
|----------------------------|高地址
| 命令行参数和环境变量 |
|----------------------------|
| 栈。。。 |
| |
| |
| ……
[/Quote]
padmepingouin 2010-12-22
  • 打赏
  • 举报
回复
返回地址也是在这个栈里面 比如a()调用b() 那么不仅需要保存传递的实参 还需要记录返回地址
这些信息是记录在一个结构体的 操作系统认识这个结构体 因此不会混乱
padmepingouin 2010-12-22
  • 打赏
  • 举报
回复
进程空间大约是这样分布的:
|----------------------------|高地址
| 命令行参数和环境变量 |
|----------------------------|
| 栈。。。 |
| |
| |
| 堆。。。 |
|----------------------------|
| 未初始化的数据 |
|----------------------------|
| 初始化的数据(楼主的I) |
|----------------------------|
| 代码 |
|----------------------------|地地址
首先 楼主举的例子是在main函数中声明的以初始化的变量 不是局部变量 而会存储在一个交.data的区域 在进程空间的位置如图
然后说局部变量 因为栈是从高低值向低地址生长的 就是说如果a()函数调用了b()函数 那么a()的相关信息会在b()的上面 这样呢 如果你在a()里面声明了好多好多的局部变量 他们也会依次向下生长保存在栈里面 等到b()执行结束时 会直接返回到a()的地址 由于a()的地址很高很高 就把b()里面的变量覆盖掉了
如图
|--------------------|
|a()相关信息等等。。 |b()函数返回地址
|---------------------|
| b()相关信息等到。。 |
| b()定义的变量们 |b()函数中变量的地址
| ... |
|---------------------|
然后你说寄存器会不会够用。。是这样的 寄存器读写当然快 但是寄存器是很少的 如果函数只有一个变量 那么编译器会自动把这个变量放在寄存器里面 但是如果变量多的话 当然就只有用的时候再放在编译器里面拉 但是栈空间是很大第 所以不用担心局部变量太多栈装不下
herostarone 2010-12-22
  • 打赏
  • 举报
回复

返回的地址貌似不是存在这个栈里吧,要不不就乱了,我感觉应该是在那个保护现场的栈里,不知道理解的对不对
[Quote=引用 5 楼 anyidan 的回复:]
c可以嵌套调用函数,每当调用一个新函数时,在栈上为其分配一段空间,村储其所用的变量,次空间由一个新的帧指针开始,向下伸展,退出时销毁帧指针,帧指针之上是返回地址,段应该类似
[/Quote]
herostarone 2010-12-22
  • 打赏
  • 举报
回复
意思是这个函数的栈跟保护现场的栈不是一个栈?保护现场的比如push 当前寄存器的状态,和这个不是一回事吧

[Quote=引用 4 楼 wuyan6293 的回复:]
C++五大存储区,int i =0;这种局部变量存储在栈中。在内存中给i分配了空间以后,调整下栈顶指针寄存器EBP(ps:好像是这个,记不清了),而不是将i push到系统栈中。
[/Quote]
herostarone 2010-12-22
  • 打赏
  • 举报
回复
意思是这个函数的栈跟保护现场的栈不是一个栈?保护现场的比如push 当前寄存器的状态,和这个不是一回事吧
[Quote=引用 2 楼 pengzhixi 的回复:]
不是说把i push了,而是说调整下栈帧指针给i一个空间。
[/Quote]
luciferisnotsatan 2010-12-22
  • 打赏
  • 举报
回复
还有可能直接把
int i =0;
i++;
这两句没意义的代码去掉了
luciferisnotsatan 2010-12-22
  • 打赏
  • 举报
回复
是在栈里,但有可能被优化为寄存器存放
赵4老师 2010-12-22
  • 打赏
  • 举报
回复
VC调试时按Alt+8,TC或BC用TD调试,打开汇编窗口看每句C对应的汇编不就啥都明白了吗。
(Linux或Unix下应该也可以在用GDB调试时,看每句C对应的汇编。)

计算机组成原理→DOS命令→汇编语言→C语言(不包括C++)、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言(包括C++)、架构……
AnYidan 2010-12-22
  • 打赏
  • 举报
回复
c可以嵌套调用函数,每当调用一个新函数时,在栈上为其分配一段空间,村储其所用的变量,次空间由一个新的帧指针开始,向下伸展,退出时销毁帧指针,帧指针之上是返回地址,段应该类似
__Silent 2010-12-22
  • 打赏
  • 举报
回复
C++五大存储区,int i =0;这种局部变量存储在栈中。在内存中给i分配了空间以后,调整下栈顶指针寄存器EBP(ps:好像是这个,记不清了),而不是将i push到系统栈中。
Defonds 2010-12-22
  • 打赏
  • 举报
回复
栈、堆
pengzhixi 2010-12-22
  • 打赏
  • 举报
回复
不是说把i push了,而是说调整下栈帧指针给i一个空间。
lifreshman 2010-12-22
  • 打赏
  • 举报
回复
这个栈是内存的,寄存器有寄存器变量用register声明,而且寄存器变量不能用&取址符。
liumapple 2010-12-22
  • 打赏
  • 举报
回复
局部变量不是需要时才申请。用完后就收回寄存器吗。会浪费吗。全局变量才浪费寄存器吧。

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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