打印
[牛人杂谈]

堆栈的理解

[复制链接]
683|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
deviceplugs|  楼主 | 2016-10-19 20:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
堆栈就是这样一种数据结构。它是在内存中开辟一个存储区域,数据一个一个顺序地存入(也就是“压入——push”)这个区域之中。有一个地址指针总指向最后一个压入堆栈的数据所在的数据单元,存放这个地址指针的寄存器就叫做堆栈指示器。开始放入数据的单元叫做“栈底”。数据一个一个地存入,这个过程叫做“压栈”。在压栈的过程中,每有一个数据压入堆栈,就放在和前一个单元相连的后面一个单元中,堆栈指示器中的地址自动加1。读取这些数据时,按照堆栈指示器中的地址读取数据,堆栈指示器中的地址数自动减1。这个过程叫做“弹出pop”。如此就实现了后进先出的原则。
  堆栈是计算机中最常用的一种数据结构,比如函数的调用在计算机中是用堆栈实现的。
堆栈可以用数组存储,也可以用以后会介绍的链表存储。
下面是一个堆栈的结构体定义,包括一个栈顶指针,一个数据项数组。栈顶指针最开始指向-1,然后存入数据时,栈顶指针加1,取出数据后,栈顶指针减1。

堆和栈是两个不同的概念。
  简单的来讲堆(heap)上分配的内存,系统不释放,而且是动态分配的。栈(stack)上分配的内存系统会自动释放,它是静态分配的。运行时栈叫堆栈。栈的分配是从内存的高地址向低地址分配的,而堆则相反。
  由malloc或new分配的内存都是从heap上分配的内存,从heap上分配的内存必须有程序员自己释放,用free来释放,否则这块内存会一直被占用而得不到释放,就出现了“内存泄露(MemoryLeak)”。这样会造成系统的可分配内存的越来越少,导致系统崩溃。

简单的可以理解为:
heap:是由malloc之类函数分配的空间所在地。地址是由低向高增长的。
stack:是自动分配变量,以及函数调用的时候所使用的一些空间。地址是由高向低减少的。


栈:只要栈的剩余空间大于所申请空间,系统将为程序提供内存,否则将报异常提示栈溢出。

堆:首先应该知道操作系统有一个记录空闲内存地址的链表,当系统收到程序的申请时,会遍历该链表,寻找第一个空间大于所申请空间的堆结点,然后将该结点从空闲结点链表中删除,并将该结点的空间分配给程序,另外,对于大多数系统,会在这块内存空间中的首地址处记录本次分配的大小,这样,代码中的delete语句才能正确的释放本内存空间。另外,由于找到的堆结点的大小不一定正好等于申请的大小,系统会自动的将多余的那部分重新放入空闲链表中。

内存碎片的理解:
1、你申请了一个4长度的内存。
2、你又申请了一个5长度的内存。
3、你释放了1申请的4长度的内存。
4、你申请>;4长度的内存。因为>;4,所以不会分配给前面的4个长度中的内存,那4个长度的内存就可以说是内存碎片。

OS的各种内存调度算法可以在不同程度上避免内存碎片的出现,但是都不可能阻止。优秀的程序员,会巧妙的安排程序的空间,尽量避免内存碎片的出现。


沙发
heisexingqisi| | 2016-10-19 21:55 | 只看该作者
堆和栈是两个不同的概念。
  简单的来讲堆(heap)上分配的内存,系统不释放,而且是动态分配的。栈(stack)上分配的内存系统会自动释放,它是静态分配的。运行时栈叫堆栈。栈的分配是从内存的高地址向低地址分配的,而堆则相反。

使用特权

评论回复
板凳
huangcunxiake| | 2016-10-20 14:50 | 只看该作者
在原生态的编程中,这个概念很重要,特别数据结构。

使用特权

评论回复
地板
Rooney30| | 2016-10-20 20:34 | 只看该作者
栈是连续的,堆是不连续的,只能在程序运行过程中申请

使用特权

评论回复
5
598330983| | 2016-10-20 22:27 | 只看该作者
malloc 向系统申请分配指定size个字节的内存空间。返回类型是 void* 类型。void* 表示未确定类型的指针。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

24

主题

135

帖子

2

粉丝