堆的使用
堆是用來管理鏈表和村的最佳方式,堆始終是從頁交換文件中分配。 優點:不必理會分配粒度和頁面邊界;缺點:分配和釋放內存塊的速度比其他方式慢。
進程有自己的默認堆1M,/HEAP改變,系統保證默認堆是線程安全的,許多windows函數用到默認堆。
額外堆:
1.對組件進行保護?//使問題局部化,一個堆中問題不影響另一個堆
2.更有效的內存管理
3.局部訪問?//把相應的數據放一個堆,一次換入內存中,比數據分散多個頁面效率高
4.避免線程同步的開銷?//自己負責堆線程安全,如果單線程可以用HEAP_NO_SERIALIZE標志來分配堆
5.快速釋放?//堆中多個內存塊,直接釋放堆而不用釋放多個內存塊
HeapCreate??//HEAP_NO_SERIALIZE?使用些標志要保證線程安全,如用臨界區,互斥量,信號量?//HEAP_GENERATE_EXCEPTIONS作用于堆中所有HeapAlloc
HeapAlloc???//HEAP_GENERATE_EXCEPTIONS只作用于當前HeapAlloc
HeapReAlloc
HeapSize
HeapFree?//釋放內存塊
HeapDestroy?//銷毀堆
如果傳HEAP_NO_SERIALIZE參數自己保證線程安全,可用
HeapLock
HeapUnlock成對函數來線程同步
HeapAlloc,HeapSize,HeapFree之類的函數內部已經調用上面的兩個函數。
?
//class.h #pragma once #include <Windows.h>//通過一組s_hHeap s_uNumAllocsInHeap來實現一個類使用一個堆。class SomeClass { public:SomeClass(void);~SomeClass(void);void* operator new(size_t size);void operator delete(void *p);UINT GetBlocks(); private:static HANDLE s_hHeap;static UINT s_uNumAllocsInHeap;int s_iMember; };
?
?
?
總結
- 上一篇: 内存映射文件
- 下一篇: 破解入门(六)-----实战“内存镜像法