首页

文章

什么事堆栈,堆栈有哪些运算,堆栈怎样存储

发布网友 发布时间:2022-03-28 00:55

我来回答

1个回答

热心网友 时间:2022-03-28 02:25

stack,其实就是一块内存空间,关键在于他的用途.
1.对于程序指令来说
执行exe时,程序都会默认分配1M堆栈空间,vs2008等开发软件都可以进行调整实际大小.
指令变成一条条机器码,cpu会一条条执行.
例子:
xxxxxxx
call 0x403650 <- --
yyyyy
在执行call命令时,cpu会把下一条指令地址写入堆栈地址空间中,当然也包括其他信息.
0x403650相当于一个子程序的地址,完事后,必然有一个ret之类的指令.这时,cpu根据先前保存的地址,也就是yyyyy这条指令所对应的地址.这样就能继续往下执行了.
关于这一点,用ollydbg好好玩一下,马上就清楚了.

2.一般的应用程序编写.
我们在编写程序时,有时采用堆栈结构,有时采用队列结构,这跟所采用的算法有很大关系.
最常见的递归算法,按递归展开的话,所有的细节就跟第1点完全一样,好处是,大都程序员根本不关心象第1点所描述的细节.只知道其调用过程和最终执行结果.具体细节可能就不关心了.

当把递归算法 用非递归算法写时,很可能你就要引入堆栈结构(其实就是人为手动申请一个内存空间,比如buffer[递归最深层数], 这样,就可以编写出直观的顺序结构的代码. cpu也不用着因调用子程序,一次次把相关信息写入系统的堆栈中(第1点所说)..因为buffer[]的存在就是为了避免这种情况.

--------------------
stack最常用两种操作,push和pop. 你可以用c或是c++ 标准库提供的实现.
如果不是大工程,基本上没必要这么做.
搞个数组 buf[], 再搞个索引变量int index,用来指示top位置. 写入数据时,index++,取出数据时index--

3.最常用的,但易忽略的.
平常所说的,局部变量就是在堆栈中分配的.所以他出了作用域就自动释放了.
c语言很容易理解,不容易出错.
但c++中,编译器有不同的策略.
比如
CTeacher t= bar();
--
CTeacher bar()
{
CTeacher xx;
为CTeacher的成员赋值
return xx.
}
你一定为这里xx对象是局部变量,出了函数作用域,对应的内存主释放了.
CTeacher t= bar();
因为bar()是返回一个Cteacher对象,所以这里就要执行拷贝构造函数,
你会奇怪,问题是bar()返回的对象是无效的.但执行却不会出错.
为什么?
首先对堆栈的理解是对.只是c++编译器内部会改写bar()这个函数.
变成 void bar(CTeacher& tmp)
这样,t就作为引用参数传入了,函数内部创建临时对象,然后赋值给引用对象就成了.结果当然正确了.

4. 是第2点的延伸,相当重要.
一些大的应用工程,往往配合堆来对内存进行管理.
以后你接触一些第三方程序,一定会奇怪,要动态申请内存,直接new或malloc一个对象不就行了么,为什么要这么麻烦.
其中一个重要原因:减少碎片,提高内存使用效率.
你先申请大的空间(new/malloc),然后借助stack的特性来管理和控制这块空间!!!
-------------------------------

ps:理解到这几层差不多够用了
ups快递客服电话24小时 贷款记录在征信保留几年? 安徽徽商城有限公司公司简介 安徽省徽商集团新能源股份有限公司基本情况 安徽省徽商集团有限公司经营理念 2019哈尔滨煤气费怎么有税? 快手删除的作品如何恢复 体育理念体育理念 有关体育的格言和理念 什么是体育理念 万里挑一算彩礼还是见面礼 绿萝扦插多少天后发芽 绿萝扦插多久发芽 扦插绿萝多久发芽 炖牛排骨的做法和配料 网络诈骗定罪标准揭秘 “流水不争先”是什么意思? mc中钻石装备怎么做 为什么我的MC里的钻石块是这样的?我想要那种。是不是版本的问题?如果是... 带“偷儿”的诗句 “君不见巴丘古城如培塿”的出处是哪里 带“奈何”的诗句大全(229句) 里翁行()拼音版、注音及读音 带“不虑”的诗句 “鲁肃当年万人守”的出处是哪里 无尘防尘棚 进出口报关流程,越详细越好。谢谢大家指教。 双线桥不是看化合价升多少就标多少的吗?为什么CL2+2KI=2KCL+I2中I失... 出师表高锰酸钾有画面了吗 2021年幼儿园新学期致家长一封信 电脑屏幕一条黑线怎么办? 销售代理商销售代理商的特点 商业代理商业代理的特征 如何看微信有没有开通微众银行 为什么微众没有开户 微众银行怎么开户 微众银行APP开户流程是什么? 唐古拉山海拔唐古拉山海拔是多少 怎么看待取消跳广场舞的人的退休金 如何选购新鲜的蓝田水柿? 恭城水柿柿树作用 创维洗衣机使用教程 创维全自动洗衣机怎么使用 自动开门器 狗羊属相婚姻相配吗 3岁的小孩不会说话怎么办 3岁孩子不会说话,应该挂什么科? 3岁小孩不会说话正常吗 鹿茸炖乌鸡怎么做? 新型冠状肺炎吃什么药可以预防 冰箱上电后一直响 食品生产许可证编号开头为“ G”。 数据结构中的栈的存储结构 在java编写的程序中,栈内存跟堆内存分别存储的是什么呢? 在什么情况下可以用栈来存储数据? Java中 堆空间与栈空间,有什么区别,一般存什么数据? 栈的顺序存储是什么? 堆栈区一般都存储哪些内容?80C51单片机的哪一块存储区要分出一些作为堆栈区使用? C语言堆 栈各存放什么数据 指针是放到栈里面的 其他那些呢 。。 java 哪些数据存放在栈中哪些存放在堆中 堆和栈分别用于保存什么? java 堆栈 里面存的都是些什么 堆栈一般用来存放什么内容 栈的存储结构 为什么我的港版iphone6在app store里面搜不到喜马拉雅fm 我的喜马拉雅年卡在换苹果手机上没了 苹果手机可以下哪种喜马拉雅听书 苹果手机可以下哪种喜马拉雅听书? 苹果电脑不支持喜马拉雅藏文输入法吗 怎么苹果里搜不到喜马拉雅听书了,什么情况? 苹果商店的喜马拉雅电台为什么没有了 苹果电脑不支持喜马拉雅藏文输入法吗? JAVA对象分步实例化中栈内存存放什么? 什么是栈存储区 手机8gb 128gb是什么意思? 电脑上的I7/8GB/128GB/1TB什么意思? 8GB+128GB跟6GB+265GB的区别 华为机身内存8GB RAM➕128GBROM是什么意思? 电脑的25cd:i5/8gb/128gb+1tb什么意思? 手机标注的8与125是什么内存? 苹果电脑13.3/2.7ghz/8gb/128gb是什么意思 荣耀x20se手机运行内存8十2GB是什么意思? OPPO手机8gb 128gb好还是6gb 256gb好用 8GB+128GB多上钱 vivo S7 8GB 128GB版本8GB 256GB版本区别? 小米9的6GB+128GB和8GB+128GB相比有多大区别? 手机视频投到电视上后,手机还要开着吗? 用电视果投屏观看视频时,手机也要一直播放视频吗? 小米电视投屏手机必须一直开着吗 为什么手机投屏然后那个为什么手机投屏 然后那个手机一直要开着? 苹果手机使用屏幕镜像投电视,手机必须一直亮着吗?不能锁屏吗,很费电的 手机视频投到电视上面后 要一直开着手机吗 还是关闭就行
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com