Windows Via C/C++ 读书笔记 12 Heap(堆)
来源:互联网 发布:怎么注销阿里云账号 编辑:程序博客网 时间:2024/05/21 22:34
Windows Via C/C++ 读书笔记 12
Heap(堆)
1. Overview
堆是除了Reserve-Commit和Memory-Mapped Files外的第三种也是最后一种内存管理方式。它适合用来保存数量很多的小块,优点是不需要做复杂的reserve-commit操作,缺点是不能commit-decommit最大化利用内存。
堆实际上是在进程地址空间中reserve出来的一个地址空间。堆中大部分地址空间是没有commit的(未分配实际内存,见前面章节),当程序在堆上面allocate内存的时候,堆管理器会完成commit操作。用户不再直接reserve-commit,一切由系统代劳了。
2. 进程的默认堆(Default Heap)
进程在创建的时候就创建了一个堆,叫做默认堆(Default Heap)。操作系统会在系统函数中使用到这个堆。因为它在进程执行前被创建,进程结束后自动释放,因此用户不能对它做创建和释放操作。系统保证对default heap的访问是串行的,即同一时间只有一个线程在它上面分配或释放内存。
如果想获取进程的默认堆句柄,调用:
HANDLE GetProcessHeap();
3. 堆的使用目的
主要有这么几个:
1. 访问安全性,把相同的东西放在同一个堆,其它线程或者函数根本不会使用到这个堆,因此不会因为指针错误影响到这个堆得数据。
2. 提高访问速度。把数组、链表节点、二叉树节点之类需要一次访问多个内存块的数据放在同一个堆中,使它们能保存在相同的内存Page里面。那么访问的时候,可以减少跨Page访问,减少物理内存页面和Page File的交换动作。
3. 提高释放内存速度,不需要一个个释放对象,直接把整个heap都释放掉。
4. 避免线程同步,跟1其实是一码事,各个线程用自己的heap。这个目的其实很白痴,变量肯定被设计在线程自己的访问域,怎么会把自己的变量放到全局访问呢。
4. 创建额外的Heap
//创建Heap
HANDLE HeapCreate(
DWORD fdwOptions,
SIZE_T dwInitialSize,
SIZE_T dwMaximumSize);
//Alloc内存
PVOID HeapAlloc(
HANDLE hHeap,
DWORD fdwFlags,
SIZE_T dwBytes);
5. 小结
使用Heap可以方便的在连续的地址空间内分配和释放内存,减少Page交换和跨Page访问数据;缺点是不能精确控制内存的commit-decommite。适合需要大量创建小对象的场合。比如动态链表,树等。
- Windows Via C/C++ 读书笔记 12 Heap(堆)
- windows via c/c++ 读书笔记
- Windows Via C/C++ 读书笔记
- Windows via C/C++ —— 进程(一)读书笔记
- Windows via C/C++ 5th 读书笔记(Ⅰ)
- Windows via C/C++ 5th 读书笔记(Ⅱ)
- Windows Via C/C++ 读书笔记 8 Fiber(纤程)
- Windows Via C/C++ 读书笔记 2
- Windows Via C/C++ 读书笔记 3
- Windows Via C/C++ 读书笔记 6
- Windows Via C/C++ 读书笔记 10
- Windows Via C/C++ 读书笔记 11
- Windows Via C/C++ 读书笔记 9 Windows Memory Architecture
- Windows Via C/C++ 读书笔记 4 线程调度 优先级
- windows via c/c++
- Windows via c/c++
- Windows Via C/C++
- 框架结构(CLR Via C#)读书笔记
- english 单词记忆 ClsitCtl篇
- 程序员等级--大家来看看你是哪一级
- 找工作的48天总结!
- c语言中的进制转化
- 最近买的书
- Windows Via C/C++ 读书笔记 12 Heap(堆)
- MSDN Webcast预告:.NET 4.0中的新特性系列课程(3):.NET 4.0 Beta1 Interop 新特性介绍 (Level 200)
- 十二年之痒
- dll,使用c代码
- 关于Detours的完整翻译
- TSO
- c++智能指针的创建
- javascript的prototype属性
- 愤怒