xiao huan / 我的图书馆 / HeapAlloc和GlobalAlloc以及VirtualAlloc...

分享

   

HeapAlloc和GlobalAlloc以及VirtualAlloc三者之间的关系 - Stay Hungry, Stay Foolish - 博客园

2008-04-19  xiao huan
    VirtualAlloc一次分配1PAGE以上的RAM. 每次分配都是PAGE的整数倍.
你不会想为了分配1个BYTE的空间而浪费剩下的4095字节. OK. 你可以自己写算法,多分
配几PAGE. 然后每次分配少量数据时就从那几PAGE中划分出来. 什么? 你笨到不会写分
配算法? 好巴 KERNEL32给你一个解决办法. 用HeapAlloc/GlobalAlloc分配RAM. 这样,
KERNEL32帮你完成分配动作, 并且尽量在减少用于跟踪空闲区域和已占用区域消耗的数
据结构.

    很久以前也有个产品叫做WINDOWS. 那时候的WINDOWS是16BIT的. 地址空间有些紧俏.
有钱不够. 还需要粮票肉票才能拿到. 你已经调用GlobalAlloc和已经出钱的性质一样.
GlobalAlloc还不够. 有时候需要GlocalLock才能确定你的东西确实可以拿到手.不然你
的指针会非法. 被充公. 你的应用会被杀头. 扯远了. 后来OS进化了. 觉得可以取消粮
票肉票. 但是你必须用新版钞票才行. 那就是HeapAlloc. 只要市场上的RAM数量没问题
. 你的HeapAlloc没问题. 那就总能拿到东西. 但是, 你总不能说有了2000版的钞票,
那80版的马上作废啊. 那GlobalAlloc也只好继续流通下去. 至于可以流通到什么时候.
没人知道.

- new是C++操作符, GlobalAlloc是WinXX的API函数。
- new除了分配内存外还会调用构造函数, GlobalAlloc已经不提倡使用为了与16位的程序兼容而保留的
- 两者均作全局内存分配,new可以根据操作系统有不同的实现(但无论如何实现,其分配出之内存只能被同一进程访问), 但后者分配的内存可以被不同进程访问(比如在进程1中分配内存,进程2中释放其。)所以后者才是真正的全局分配.
一般除了在剪贴板等函数中使用GlobalAlloc函数返回的句柄外,在其它地方使用GlobalAlloc函数的地方不多啊

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多
    喜欢该文的人也喜欢 更多

    ×
    ×

    ¥.00

    微信或支付宝扫码支付:

    开通即同意《个图VIP服务协议》

    全部>>