HeapAlloc,LocalAlloc,VirtualAlloc区别??

ryman 2004-09-09 01:40:45
MSDN上面这样说:
LocalAlloc:速度比其他内存管理函数慢,功能不多,推荐使用HeapAlloc
HeapAlloc:缺点是内存块小,不能超过4MB,推荐使用VirtualAlloc
VirtualAlloc:内存块可以超过4MB

那是不是就说明VirtualAlloc最高级,但是这3个函数的工作原理差不多是一样的。

小弟没有编过windows程序,就是针对这3个概念问问。谢谢!

...全文
616 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
载舟之水 2004-09-09
  • 打赏
  • 举报
回复
这三个函数的工作原理是不一样的,任何函数都脱离不了操作系统,就如同malloc在windows下和在嵌入式系统下,实现的过程是完全不一样的。

我这里简要说明一下这三个函数在WinCE.net 4.2 下的实现过程。具体请参考Douglas Boling 的《Programming Microsoft Windows CE .NET》

WinCE下一个进程是活在一个盒子里(即slot)系统总共有33个slot用于放置进程。
每个进程可用于分配的虚拟内存空间理论值为32M,实际值可能小于16M。
(以下所有论述皆为虚拟内存,不涉及物理内存)
其中包括 地址空间由下至上为 [其他]-> [栈]-> [本地堆]-> [自由空间]-> [非XIP DLL]

LocalAlloc 是在系统的本地堆中分配的函数,它可以以字节为单位进行分配,但实际上即使分配1个字节,系统也会保留8个字节,所以你最好一次8个分配(其实系统最终是以页面为单位提交的)。本地堆由于分配的内存块是固定的,不会在系统内存缺乏时自动合并内存碎块,所以一般不要用来频繁分配大块的内存,但小块的内存是可以的。

HeapAlloc 是在分离堆中分配,它克服了LocalAlloc 的缺点,这里你误解了,应该是先用HeapCreate 在[自由空间]中建立一大块的分离堆空间,然后再用HeapAlloc和HeapFree在分离堆空间中分配和释放。当完全不需要的时候,可以一次性地用HeapDestroy 取消分离堆。这样就避免了内存“孤岛”的出现,同时增大了操作系统在寻找可用内存时的命中率。(它同样要遵循8字节补齐原则)

VirtualAlloc 是也和上面一样是虚拟内存管理函数,但是它是以页面为单位的,页面最大的大小和具体的CPU有关,有的是1K有的是4K,实际大小和操作系统的设定也有关。一般用得最多的是4K,页面分配以64k为单位进行保留和提交,就是说即使你只分配一页(4K),系统也会给它分配64k,所以你最好一次分配64k的倍数。 当用它分配超过2M时,系统将在
[大型内存区域]中分配,这个是在33个slot之上的内存区域中分配。(32位系统可寻址范围为4G)

以上只是简单描述,如果你看不明白的话,那就需要仔细理解Windows CE 的内存管理机制和架构,我再次查阅了MSDN,我的MSDN版本是(2004年7月)
只在有关WinCE1.0-1.01的版本中提到堆分配有1M的限制,我想了解一下你是在何处看到有4M的限制的?

再次说明一下我上面提到的内容是WinCE.NET 其他系统可能有所区别,每个系统都需要分别对待。

19,500

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 嵌入开发(WinCE)
社区管理员
  • 嵌入开发(WinCE)社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧