HeapAlloc和GlobalAlloc以及VirtualAlloc三者之間的關(guān)系 - Stay Hungry, Stay Foolish - 博客園
VirtualAlloc一次分配1PAGE以上的RAM. 每次分配都是PAGE的整數倍.
你不會(huì )想為了分配1個(gè)BYTE的空間而浪費剩下的4095字節. OK. 你可以自己寫(xiě)算法,多分
配幾PAGE. 然后每次分配少量數據時(shí)就從那幾PAGE中劃分出來(lái). 什么? 你笨到不會(huì )寫(xiě)分
配算法? 好巴 KERNEL32給你一個(gè)解決辦法. 用HeapAlloc/GlobalAlloc分配RAM. 這樣,
KERNEL32幫你完成分配動(dòng)作, 并且盡量在減少用于跟蹤空閑區域和已占用區域消耗的數
據結構.
很久以前也有個(gè)產(chǎn)品叫做WINDOWS. 那時(shí)候的WINDOWS是16BIT的. 地址空間有些緊俏.
有錢(qián)不夠. 還需要糧票肉票才能拿到. 你已經(jīng)調用GlobalAlloc和已經(jīng)出錢(qián)的性質(zhì)一樣.
GlobalAlloc還不夠. 有時(shí)候需要GlocalLock才能確定你的東西確實(shí)可以拿到手.不然你
的指針會(huì )非法. 被充公. 你的應用會(huì )被殺頭. 扯遠了. 后來(lái)OS進(jìn)化了. 覺(jué)得可以取消糧
票肉票. 但是你必須用新版鈔票才行. 那就是HeapAlloc. 只要市場(chǎng)上的RAM數量沒(méi)問(wèn)題
. 你的HeapAlloc沒(méi)問(wèn)題. 那就總能拿到東西. 但是, 你總不能說(shuō)有了2000版的鈔票,
那80版的馬上作廢啊. 那GlobalAlloc也只好繼續流通下去. 至于可以流通到什么時(shí)候.
沒(méi)人知道.
- new是C++操作符, GlobalAlloc是WinXX的API函數。
- new除了分配內存外還會(huì )調用構造函數, GlobalAlloc已經(jīng)不提倡使用為了與16位的程序兼容而保留的
- 兩者均作全局內存分配,new可以根據操作系統有不同的實(shí)現(但無(wú)論如何實(shí)現,其分配出之內存只能被同一進(jìn)程訪(fǎng)問(wèn)), 但后者分配的內存可以被不同進(jìn)程訪(fǎng)問(wèn)(比如在進(jìn)程1中分配內存,進(jìn)程2中釋放其。)所以后者才是真正的全局分配.
一般除了在剪貼板等函數中使用GlobalAlloc函數返回的句柄外,在其它地方使用GlobalAlloc函數的地方不多啊
本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請
點(diǎn)擊舉報。