社区
C++ 语言
帖子详情
为什么用栈来存储局部变量
swytcz201314
2010-05-20 10:24:44
如题。用队列或者普通的数组不行吗,是不是一个线程就有一个栈?每个栈有多大呢?
...全文
1007
13
打赏
收藏
为什么用栈来存储局部变量
如题。用队列或者普通的数组不行吗,是不是一个线程就有一个栈?每个栈有多大呢?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
13 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
CVA4508M
2010-05-20
打赏
举报
回复
函数调用的本质就是栈操作,所以用栈来存储局部变量是最直观的做法
(详细情况可参见冯诺依曼体系结构)
每个线程都有自己的栈,在线程启动时由操作系统分配的。
栈的大小跟操作系统有关,而且一般操作系统会根据你的栈的使用情况,动态调整栈的大小
linux下 ulimit 可以设置栈的默认大小。
brk()系统调用,可以在程序运行时调整栈的大小(即使你不调用它,系统也会自动调整)
wade_2003
2010-05-20
打赏
举报
回复
ls说的很有理撒
高性能架构探索
2010-05-20
打赏
举报
回复
因为你是局部变量,所以在推出作用域的时候,就得释放这些局部变量所占用的空间,用栈的话,可以通过栈顶指针的移动来释放空间,当然也可以用堆,但用堆的话,如果不释放,则会造成内存泄露
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
打赏
举报
回复
玩的就是内存这玩意~
最全的C和C++语言笔试面试题汇总
最全的C和C++语言笔试面试题汇总,我大四时候找工作时候他帮上了很多忙,里面的题目经常考到。希望对大家有帮助。
局部变量
和函数参数为什么要放在栈中
局部变量
和函数参数为什么要放在栈中 - 简书 (jianshu.com)
局部变量
,顾名思义其作用域属于局部。全局的变量,意味着谁都随时随地可以访问,所以其放在数据段中。而
局部变量
只是自己在用,放在数据段中纯属浪费空间,没有必要,故将其放在自己的栈中,随时可以清理,真正体现了局部的意义。 这个就是堆栈框架,栈由于是向下生长的,堆栈框架就是把esp指针提前加一个数,原esp指针到新esp指针之间的栈空间用来
存储
局部变量
。解释一个概念,堆是程序运行过程中用于动态内存分配的内存空间,是操作系统为每个用户进
关于
局部变量
存放在栈区的问题
昨天在看jvm运行态数据存放区域的时候,看到他的栈区用于存放
局部变量
,突然有个问题,为啥
局部变量
要放在栈中。似乎之前学C的时候,C的
局部变量
也是放在栈中,当时学写汇编的时候似乎没有这方面的问题。好吧,来整理下。产生这个问题的主要原因是,
局部变量
为啥要
用栈
结构来保存,因为觉得栈访问的时候会pop,这样的话就会将
局部变量
给弄没了,这不是懵逼了么。后来仔细想了想当时自己写OS的时候的想法,其实...
java变量表_java栈之
局部变量
表
前言:栈:栈是jvm内存之一,被线程独享,不存在线程安全问题。当一个线程被创建时,jvm会随之为其创建一个栈。栈桢:栈桢是栈的元素。当一个方法被调用时,jvm会为其创建一个栈桢。方法中的各种处理,便是一个出栈入栈的过程。栈桢的结构:栈桢由四部分组成,分别是
局部变量
表、操作栈、动态链接、返回地址。
局部变量
表:顾名思义,
局部变量
表是用来
存储
局部变量
的。
局部变量
包含两部分,一是方法中的参数,二是方法中创...
在C程序中,
局部变量
的
存储
空间应在**栈(Stack)**上分配
在C程序中,
局部变量
的
存储
空间应在**栈(Stack)上分配。栈是一种自动管理
存储
空间的区域,系统会在函数调用时自动分配
局部变量
的
存储
空间,并在函数执行结束时自动回收这些
存储
空间。这种机制使得栈上的
存储
空间管理非常高效,但栈的大小通常是有限的。当栈空间不足时,会发生栈溢出(Stack Overflow)**错误。栈溢出是一种常见的运行时错误,通常会导致程序崩溃或行为异常。栈空间不足会导致栈溢出错误,通常表现为程序崩溃或行为异常。栈溢出的主要原因是递归调用过深、
局部变量
过大或嵌套函数调用过深。
C++ 语言
65,179
社区成员
250,527
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章