数据结构和内存分配的堆栈

数据结构和内存分配的堆栈

数据结构中的栈(Stack)和堆(heap)和内存分配中的堆和栈没有直接的关联,只是因为名称相同而容易混淆,下面我们来讨论再数据结构中和内存分配中堆栈的具体含义。

数据结构中的堆和栈

数据结构中,栈(stack)是限定仅在表尾进行插入或者删除的线性表。最重要的特点是后进先出。
堆的定义则比较抽象:
如果有一个关键码的集合K = {k0,k1, k2,…,kn-1},把它的所有元素按完全二叉树的顺序存储方式存储在一个一维数组中,并满足:Ki <= K2i+1 且 Ki<=K2i+2 ,则称为小堆(或大堆)。
简单来说,就是父节点的值总是大于/小于子节点的值。
最重要的特点是:堆总是一棵完全二叉树。

内存分配中的堆和栈

对程序而言,内存空间在逻辑上分为三部分:代码区,静态数据区和动态数据区,动态数据区又分为栈区和堆区。

代码区:代码区(code segment)通常是指用来存放程序执行代码的一块内存区域,存放函数体的二进制代码。这部分区域的大小在程序运行前就已经确定。

静态数据区:静态数据区(data segment)通常是指用来存放程序中常量,全局变量和静态变量的一块内存区域。数据段属于静态内存分配。程序结束后由系统自动释放。
未初始化的全局变量与未初始化的静态变量,和已初始化的全局变量与已初始化的静态变量分别位于静态存储区的不同区域。
(注意:在c语言中,全局变量和静态变量是被分为初始化和未初始化的,分别被分配在,但是c++中不做区分,统一放在该区域。为了详细区分,我们采用C语言的标准。)

例如,在采用段式管理结构的操作系统中,bss段存放程序中未初始化的全局变量和静态变量,data段存放已初始化的全局变量和静态变量,两部分共同构成了静态数据区;而text段即为代码区,一个程序本质上都是由bss,data和text三段构成。
(注意:特殊的,初始化值为0的静态变量和全局变量存储在bss段)

动态数据区(堆和栈):
内存分配时,堆和栈都是内存的一块区域,不具有上面所述数据结构中堆栈的性质,而有他们独特的性质:
栈(栈区):该部分主要用于存储函数的形参、局部变量、返回值。由系统自动分配和回收
函数中定义的局部变量按照先后定义的顺序依次压入栈中,栈的内存地址生长方向与堆相反,由高到底(从内存高地址向低地址存储),栈中存储的数据的生命周期随着函数的执行完成而结束。

堆(堆区):堆是用于存放进程运行中被动态分配的内存段,主要由程序员进行申请和释放,它的大小并不固定,可动态扩张或缩减。当进程调用malloc/new等分配内存时,新 分配的内存就被动态添加到堆上(堆被扩张);当利用free等释放内存时,被释放的内存从堆中被剔除(堆被缩减)。
堆区中的生长方向由低到高(从内存低地址向高地址存储),并不一定按照申请顺序分配地址空间的高低。堆中存储的数据的若未释放,则其生命周期等同于程序的生命周期。
堆上存储空间的分配方式:在操作系统记录空闲内存地址的链表中遍历该链表,寻找第一个空间大于所申请空间的堆节点,然后将该节点从空闲节点链表中删除,并将该节点的空间分配给程序。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值