日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

堆的使用

發布時間:2025/3/20 编程问答 13 豆豆
生活随笔 收集整理的這篇文章主要介紹了 堆的使用 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

堆是用來管理鏈表和村的最佳方式,堆始終是從頁交換文件中分配。 優點:不必理會分配粒度和頁面邊界;缺點:分配和釋放內存塊的速度比其他方式慢。
進程有自己的默認堆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; };


?

//class.cpp #include "SomeClass.h"SomeClass::SomeClass(void):s_iMember(s_uNumAllocsInHeap) { }SomeClass::~SomeClass(void) { }void* SomeClass::operator new(size_t size) {if( s_hHeap == NULL ){s_hHeap = HeapCreate(HEAP_NO_SERIALIZE,0,0);if( s_hHeap == NULL )return NULL;}void *p = HeapAlloc(s_hHeap,0,size);if( p != NULL ){s_uNumAllocsInHeap++;}return p; }void SomeClass::operator delete(void *p) {if( HeapFree(s_hHeap,0,p) )s_uNumAllocsInHeap--;if(s_uNumAllocsInHeap == 0 ){if( HeapDestroy(s_hHeap) )s_hHeap = NULL;} }UINT SomeClass::GetBlocks() {return s_uNumAllocsInHeap; }HANDLE SomeClass::s_hHeap = NULL; UINT SomeClass::s_uNumAllocsInHeap = 0;


?

//main.cpp #include "SomeClass.h" #include <iostream>void wmain() {SomeClass *p1 = new SomeClass();UINT uint1 = p1->GetBlocks();SomeClass *p2 = new SomeClass();UINT uint2 = p2->GetBlocks();SomeClass *p3 = new SomeClass();UINT uint3 = p3->GetBlocks();delete p1;delete p2;UINT uintsss = p3->GetBlocks();delete p3;std::cout<<uint1<<" "<< uint2 << " " << uint3 << " " << uintsss << std::endl; }


?

總結

以上是生活随笔為你收集整理的堆的使用的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。