大白话入门栈stack

大白话入门栈stack

要聊栈要分三个角度聊,我之前也是写了好几年代码才真的明白这东西,之前都是十分模糊,就是因为很多的文章只写其中一个角度。
哪三个角度?
1. 数据结构的角度
2. 程序运行的角度
3. 内存的角度

我只总结关键的一些内容,其他的自己去我下面分享的文章去看
1数据结构的角度

栈是一种逻辑的数据结构,可以用数组和链表来实现,栈的数据结构就是先入后出(filo),说白了就是你能用一个程序来实现先入后出。

2程序运行的角度

比如我a函数调用了b函数,b又调用了c函数,那我的程序调用的流程应该是这样

a->b->c

我们都知道调用函数会开辟一个栈空间,那应该是先开了a栈帧,然后开了b栈帧,接着开了c栈帧,符合上面a->b->c对吧。但是你实际上期望的结果应该是先执行c函数,然后c函数执行完的结果返回给b,b拿到c返回的结果继续执行返回结果给a,a拿到b返回的结果继续执行直到程序结束,是不是就变成

c->b->a

在通俗点就是函数调用的顺序是a调用b,b调用c,但是希望的是c执行完给b,b执行完再给a,有没有点先入后出的感觉了。

3 内存角度

你程序运行肯定是需要内存的,不然你定义的变量放在哪里呢。cpu是怎么执行你写的3+2呢,首先是把你写的程序加载到内存,然后为你的3和2开辟内存空间,然后cpu通过寄存器从内存中拿到3和2,寄存器先理解为就是更小内存但是更快,他就是负责从内存拿数据给cpu计算的,内存又分为堆heap和栈stack,这次这个栈是内存角度说的,我们都直到你执行函数的时候会开辟一个栈空间,new对象的时候会开辟堆空间,这俩空间还是又区别的,借用别人的话它们的主要区别是:stack是有结构的,每个区块按照一定次序存放,可以明确知道每个区块的大小;heap是没有结构的,数据可以任意存放。因此,stack的寻址速度要快于heap。具体这俩的区别再看后面的文章吧。

什么是栈?
http://www.ruanyifeng.com/blog/2013/11/stack.html
什么是堆和栈
http://www.ruanyifeng.com/blog/2018/01/assembly-language-primer.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值