• 内存分配函数分类


    4种用于内存分配的API函数。虚拟VIRTUAL函数用于分配和管理大数量的内存,堆函数HEAP用于小数量内存,全局函数GLOBAL及局部函数LOCAL用于小数量内存分配,这两类函数是为了实现与16位系统兼容而提供的。WIN32 API仍然维护全局以及局部的堆函数,但是它们都是从局部的2GB中分配内存。这些堆对于进程而言都是局部的,不能被其他进程访问。

           当一个程序需要分配一个至少几KB缓存时,使用VIRTUALALLOC函数获得内存块。它以4KB为单位获取内存,分配的内存以4KB来对齐。当程序需要为小对象,数组或者结构分配内存时,调用HEAPALLOC函数更合适。将VIRTUALALLOC函数用于对小数据结构的访问会造成内存资源的浪费。

           每个进程都有一个默认堆,但是为了提高效率和便于管理,程序也可以分配额外的堆。每个堆都有自己的句柄,调用GETPROCESSHEAP函数获得默认堆的句柄。

           进程中的线程可以访问进程中的默认堆,WIN32内存管理对堆的访问是串行的。当一个线程执行一个堆函数时,其他线程对内存的请求就会被挂起直到函数结束。这样会给程序带来很小的延迟。如果一个线程需要访问一些堆并且不想与其他线程分享这个堆,那么为线程分配私有堆PRIVATE HEAP要比使用默认堆快得多。在线程使用私有堆的情况下,可以在堆分配时选择不对堆进行串行化处理。这样的话,那些需要其他堆空间的其他线程就不会被延迟。如果需要使用方便或者需要代码紧凑就应使用默认堆,如果需要速度则应使用线程私有堆。

           动态链接库在默认情况下不拥有自己的堆,它与调用它的进程共享堆,DLL可以分配自己的私有堆并使用它。

           当程序使用完堆以后一定要释放堆。否则会产生内存泄漏MEMORY LEAK。一个规则就是,谁分配谁释放。

  • 相关阅读:
    C/C++数组名与指针区别深入探索(转)
    mysql 的编译安装
    rpm的问题 ~/.rpmmacros %_rpmlock_path
    GCC中的弱符号与强符号(转)
    关于printf系列函数
    如何修改机器名
    multiple definition of XXXX 的解决
    由无名对象(临时对象)引发的关于“引用”的思考
    关于date中时间字符串的格式
    月薪不同,面试题不同!
  • 原文地址:https://www.cnblogs.com/hnxxcxg/p/2940700.html
Copyright © 2020-2023  润新知