为什么用栈来存储局部变量

swytcz201314 2010-05-20 10:24:44
如题。用队列或者普通的数组不行吗,是不是一个线程就有一个栈?每个栈有多大呢?
...全文
1007 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
CVA4508M 2010-05-20
  • 打赏
  • 举报
回复
函数调用的本质就是栈操作,所以用栈来存储局部变量是最直观的做法
(详细情况可参见冯诺依曼体系结构)

每个线程都有自己的栈,在线程启动时由操作系统分配的。

栈的大小跟操作系统有关,而且一般操作系统会根据你的栈的使用情况,动态调整栈的大小
linux下 ulimit 可以设置栈的默认大小。
brk()系统调用,可以在程序运行时调整栈的大小(即使你不调用它,系统也会自动调整)
wade_2003 2010-05-20
  • 打赏
  • 举报
回复
ls说的很有理撒
  • 打赏
  • 举报
回复
因为你是局部变量,所以在推出作用域的时候,就得释放这些局部变量所占用的空间,用栈的话,可以通过栈顶指针的移动来释放空间,当然也可以用堆,但用堆的话,如果不释放,则会造成内存泄露
akonlbjrd 2010-05-20
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 sinosinux 的回复:]
你说的这个栈是系统自动分配的。栈的数据访问特点是‘先进先出’。计算机系统利用这一特点实现函数的嵌套调用。
每个线程都有一个调用栈,这个栈的大小是由系统分配的。
[/Quote]
栈的数据访问特点是“先进 后出吧??”.
zhushengze 2010-05-20
  • 打赏
  • 举报
回复
你说的这个栈有别于数据结构中的栈,只是操作方式类似与数据结构中的栈,应该是先进后出!是C/C++编译的程序占用的内存的一种,由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。
在函数调用时,第一个进栈的是主函数中后的下一条指令(函数调用语句的下一条可执行语句)的地址,然后是函数的各个参数,在大多数的C编译器中,参数是由右往左入栈的,然后是函数中的局部变量。注意静态变量是不入栈的。
一个由C/C++编译的程序占用的内存分为以下几个部分:
1、栈区(stack)― 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。
2、堆区(heap) ― 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。
3、全局区(静态区)(static)―,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 - 程序结束后有系统释放
4、文字常量区 ―常量字符串就是放在这里的。 程序结束后由系统释放
5、程序代码区―存放函数体的二进制代码。
冻结 2010-05-20
  • 打赏
  • 举报
回复
因为函数调用是典型的适合栈实现的。
所以函数内部的局部变量就放在栈上了。
swytcz201314 2010-05-20
  • 打赏
  • 举报
回复
栈是先进后出吧.....?
patricxuqi 2010-05-20
  • 打赏
  • 举报
回复
[Quote=引用楼主 swytcz201314 的回复:]
如题。用队列或者普通的数组不行吗,是不是一个线程就有一个栈?每个栈有多大呢?
[/Quote]函数调用的时候总需要记录些东西吧,这些东西你说放在哪里好呢?每一个线程都有自己的栈,且其默认的大小为1M。
pengzhixi 2010-05-20
  • 打赏
  • 举报
回复
只是表现形式上是栈
sinosinux 2010-05-20
  • 打赏
  • 举报
回复
你说的这个栈是系统自动分配的。栈的数据访问特点是‘先进先出’。计算机系统利用这一特点实现函数的嵌套调用。
每个线程都有一个调用栈,这个栈的大小是由系统分配的。
magic7004 2010-05-20
  • 打赏
  • 举报
回复
另外,用栈还有个好处就是操作简单,速度快。
zhh_kv 2010-05-20
  • 打赏
  • 举报
回复
1:每个线程都有属于自己的栈(和堆),此栈其空间的申请与释放由系统管理(堆内存得由应该程序管理),其特点是“后进先出”;
2:若用队列或数组,也可以用程序的方式实现栈的功能,但是在应用程序中所要做的工作就要加大很多。

例如:在自己编写的解释器中,可以用队列或数组的方式实现“栈”的功能,来完成函数调用等功能。
liutengfeigo 2010-05-20
  • 打赏
  • 举报
回复
玩的就是内存这玩意~

65,179

社区成员

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

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