近时间,做了一个内存管理的报告,顺便整理了一下内存方面的知识。下面就几种常用的内存分配方法做一个对比。
内存分配方法 | 适用场合 | 优缺点 |
虚分配 | 最适合用来管理大型对象或者结构数组。比如说,电子表格程序,有很多单元格,但是也许大多数的单元格是没有数据的,用不着分配空间。一般来说,如果需要内存大于1M,用虚拟内存比较好。 | 优点:需要的时候才真正分配内存,同时具有数组的快速和链表的小空间的优点 |
内存映射文件 | 最适合用来管理大型数据流(通常来自文件)以及在单个计算机上运行多个进程之间共享数据 | 优点:不必再对文件执行I/O操作,不必再为文件申请并分配缓存,;多个进程之间共享数据 |
内存堆栈 | 最适合用来管理大量的小对象 | 优点:可以不考虑分配粒度和页面边界之类的问题。 缺点:分配和释放内存块的速度比其他机制要慢,并且无法直接控制物理存储器的提交和回收。
|
函数 | 内存分配位置 | 备注 |
VirtualAlloc | 虚拟内存 | VirtualAlloc一次分配1PAGE以上的RAM. 每次分配都是PAGE的整数倍. |
GlobalAlloc (Windows 16) | 从全局堆上分配
| 代码段被装入全局 堆,与GlobalLock同时使用 |
LocalAlloc (Windows 16)
| 从局部堆中分配 | 系统为每个实例从全局堆中分配了一个64kb的数据段作为该实例的局部堆,用来存放应用程序的堆栈和所有全局或静态变量。 |
HeapAlloc | 省缺的私有堆,该分配方法是从一指定地址开始分配 | HeapALloc是从堆上分配一块内存,且分配的内存是不可移动的;KERNEL32帮你完成分配动作, 并且尽量在减少用于跟踪空闲区域和已占用区域消耗的数据结构 |
malloc | 一般malloc的实现并不是从系统的堆中分配的,而是从编译器连接的运行库自己管理的堆中 | 在Win32平台上的开发工具的编译 结果中,通常是用HeapCreate创建一个堆,用HeapAlloc和HeapRealloc维护堆的空间增长,在最后用HeapDestroy删除堆。而在用malloc分配、用free释放时则由运行库的代码负责从这个堆中分配空间和向这个堆中归还空间,并维护这个堆中的数据结构。 |
new | 一般编译器中的new都是用malloc来分配内存的 | new与C++的构造函数和异常机制有关。 new可以认为是malloc加构造函数的执行 |
第一次使用,不知道怎么创建表格,格式是一塌糊涂。