关于堆栈(1)

我们总结一下前面讲过的:
虚拟内存:
1.虚拟内存可以用于处理大批量数据
内存映射文件:
1.内存映射文件加载exe和DLL可以节省时间和页文件
2.使用内存映射文件来访问磁盘上的文件,可以避免I/O读写,也不需要为文件内容进行缓存
3.内存映射文件可以用于进程间的共享
4.对于某些数据量不确定的应用,可以使用稀疏文件

今天主要说的是堆栈:
堆栈的作用是可以用来进行分配较小的数据快,缺点是,分配和释放内存的速度比其他方法要慢,且无法直接控制物理存储器的回收

MicroSoft并没有以文档的形式来规定堆栈释放和回收存储器应该规定的规则,但是,windows98注重内存的使用,因此,只要有可能,他就收回堆栈。windows2000注重速度,因此,即使堆栈不用了,它也不会立即释放,只有等一段时间不用之后,才会将内存返回给页文件

默认堆栈
每个进程都有一个默认堆栈,这个堆栈的大小如果不设置的话就是1MB,若要改变其大小,设定2M,可以使用链接开关/HEAP:2097152
默认堆栈相当重要,很多系统函数都需要使用默认堆栈,比如Ansi版本的函数,一般都会把它转化成Unicode版本,然后再执行,但是执行期间,转化字符串需要的缓冲区必须要从默认堆栈分配,这一点我们无法更改,且每个函数都是按顺序访问的,不会同时访问堆栈,这样就不会破坏堆栈数据

除此之外,我们还可以创建辅助堆栈
为什么要创建辅助堆栈
1.保护组件
关于这个,我们先看个图
这里写图片描述
假设有两个组件,一个是节点结构的链表,一个是branch结构的二进制树,假设链表代码发生错误,使得节点1后面的若干个字节的数据被破坏,这样就有可能威胁到分支3的数据,这样,当我们遍历二进制树的时候就会发生错误
假如这两个组件分别存放在两个堆栈中,就不会发生这样的事情
2.更加有效的管理内存

这里写图片描述
我们假设每个节点结构需要24个字节,每个分支结构需要32个字节,如果节点1和节点3被释放,这个时候再分配一块内存给一个新的分支,就会失败,因为虽然可用的是48字节,但是都是零碎的,没有一块完整的32字节的区域
如果为每个组件建立单独的辅助堆栈, 每个堆栈只包含大小相同的对象,那么释放一个对象后,另一个对象刚好可以进入被释放的控件

3.进行本地访问
内存是按页分配的,如果两个组件在两个页面上交叉排布,比如节点1在A页面上,节点2在B页面上,节点3在C页面上,CPU访问3个节点需要访问3个不同的页面,如果内存不够,还会发生内存的置换,这样就大大降低了程序的运行速度。
如果是节点全部分布在一个页面上,分支全部分布在另一个页面上,这样处理节点或者处理分支,就不需要CPU额外引用内存页面

4.减少线程同步的开销
按照默认设置,堆栈是顺序进行的,即使多个线程试图同时访问堆栈,也不会使数据收到损坏,但是这样的话,就必须执行额外的代码,以保证堆栈的绝对安全,如果你自己创建一个辅助堆栈,告诉他只有一个线程访问该堆栈,这样就不需要执行额外代码,大大提高了执行效率

5.迅速释放堆栈
正如上面所说,把所有的节点或者分支建在一个一个堆栈中,如果我不想要了,我只要撤销这个堆栈,所有的节点或者分支都被释放了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值