各种内存分配方式的关系与比较

1、功能上的区别:

     HeapAlloc、GlobalAlloc、LocalAlloc、在功能上没有太大的区别,都是在堆中分配内存,分配的内存不需要进行页对齐,也不用关心分页机制、页面状态、页面属性等内容,因为这一切操作系统中的堆管理器会帮我们解决。HeapAlloc是程序在需要分配内存的最直接的方式。

    堆内存管理依赖于虚拟内存管理。在创建堆时,HeapCreate函数会向系统请求虚拟内存分页,之后在这个堆上的内存分配实际上是在从虚拟内存管理中获取的内存分页上再分配大小任意的内存块,如果在建立堆时指定了固定了堆大小,那么在堆上分配内存块时,其范围不能超过设置的堆大小,堆大小一定是内存页大小的整数倍。如果在建立堆时不固定堆的大小,堆管理函数会根据分配的请求数量,动态地向虚拟内容管理函数请求内存分页。

    VirtualAlloc的功能是对进程虚拟地址空间中内存分页的状态进行管理,属于虚拟内存管理的范围。当然内存的分配也是通过改变虚拟内存页面属性实现的。所以VirtualAlloc间接达到了分配内存的目的。堆管理器也是依赖于虚拟内存管理的,在收到HeapAlloc的内存分配的请求时,堆管理器会根据情况决定是否使用虚拟内存管理机制分配新的页面,以及如何在页面上布局分配的内存块,从这个层次上讲VirtualAlloc更为低层。

2、效率的区别:

    HeapAlloc、GlobalAlloc、LocalAlloc在32位系统上功能是一致的,但是由于GlobalAlloc、LocalAlloc需要兼容16位系统,所需进行的判断和处理会更多,因此GlobalAlloc、LocalAlloc较HeapAlloc效率低。当然标准C函数malloc也是调用HeapAlloc实现的,所以其效率也必然比HeapAlloc低

   由于HeapAlloc与VirtualAlloc功能定位上的不同,所以在效率上没有可比性。从原理上讲,HeapAlloc在分配内存时,如果堆管理器中有足够的已提交的页面可以使用,那么它不需要将内存分页从其他状态改变为已提交状态,只需要在堆管理器中进行相关管理;如果在分配时没有足够的已提交页面使用,那么还需要将虚拟内存分页从其他状态改变为已提交状态,在有足够的可使用的已提交的情况下,再由堆管理器进行相关管理。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值