全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:3446
推到 Plurk!
推到 Facebook!

請問heap

答題得分者是:miyu
mismmx
一般會員


發表:4
回覆:6
積分:2
註冊:2003-05-26

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-09-01 01:07:25 IP:218.162.xxx.xxx 未訂閱
曾經有人告訴小弟win98的記憶体配置有問題 如果要寫大型程式須用heap的方式 可是小弟翻了一些書都沒看到什麼是heap 不知道各位大大有沒有人知道heap可不可告訴一下小弟 如果有用法就更好了~~~ 謝謝!!!!
miyu
中階會員


發表:13
回覆:96
積分:91
註冊:2003-05-01

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-09-01 07:17:18 IP:61.217.xxx.xxx 未訂閱
引言: 曾經有人告訴小弟win98的記憶体配置有問題 如果要寫大型程式須用heap的方式 可是小弟翻了一些書都沒看到什麼是heap 不知道各位大大有沒有人知道heap可不可告訴一下小弟 如果有用法就更好了~~~ 謝謝!!!!
我想你看錯書了, 與 Advanced Windows 同級的書大都會提到 Heap. 或是, 講 Operating System 的書應該也會提到 Heap Memory, 因為這是 OS Memory management 的策略. 所謂的 Heap, 指的是未被使用並受到 OS 管理的記憶體. 至於怎麼用, 你就直接呼叫 HeapAlloc() 去要求 OS 配置:
unigned char *Buffer;
Buffer = (unsigned char *) HeapAlloc(GetProcessHeap(), HeapFlag, BufferSize);
釋放則是呼叫 HeapFree() 不過, 事實上你不用這麼麻煩去呼叫 HeapAlloc(), 直接呼叫 malloc()/free() 就好了. 事實上, C 的 new, standard way 也幾乎都是呼叫 malloc() 去實作. 而 VC 跟 BCB 的策略上不一樣. VC 是去呼叫 HeapAlloc() 配置記憶體. 而值得一談的是, Debug 版的 malloc() 用了 很多功夫用來幫助除錯, 它會用一個 linked list 去幫你追蹤已配置的記憶體, node 裡面會擺放 source file name, line number, size, 第幾次 alloc 等資料, 幫助你追蹤. (VC Debug版程式結束的時候, 要是你的程式有 memory leak 的情況, debug message 就是這樣吐出來的). 甚至, 你可以將某些 macro 設定, 去模擬各種記憶體配置時的錯誤狀況, 比方說 out of memory. VC 直接使用 HeapAlloc(), HeapFreE(), HeapSize() 去作記憶體管裡, 而 malloc(), free() 說穿了只是一層外包而已. 這個好處是, 它充分的利用了 Operation System (Win32) 提供的 功能. 而 BCB 並不採用這個辦法. BCB 採用所謂的 memory pool 法. (Delphi應該也是用這個, 很抱歉我沒有去 trace 過 Delphi. 不過由於主要的 code 是用 object pascal 寫的, 我實在沒什麼理由相信 delphi 會另起爐灶搞一份) BCB 在內部作了一個 TMemoryManager 去管理記憶體. 簡單的說, TMemoryManager 會 呼叫 VirtualAlloc() 去跟 OS 要記憶體, 以 16k 一個單位 (另, 以 VirtualAlloc() 去分配記憶體, 一定要是 Paging size 的倍數. Windows for IA32 用的是 4K/Page). 而當 User 程式有記憶體配置請求時, TMemoryManager 會去找尋自己管理的表格, 將沒人用的記憶體配置出去, 並且在這塊記憶體的前面記錄這塊分配出去的記憶體的 大小. 如果 pool 裡的記憶體不夠, 則再呼叫 VirtualAlloc() 向系統索求. 而 BCB 這種策略的最大好處是, 在配置記憶體的速度上, 會比 VC 快. 我記得差距應該是一個級數... 當然了, Memory pool 開發出來的目的本來就是針對 native OS API 配置記憶體的速度 太慢而產生的. 所以說, 以前機器慢的時候, 為什麼有些程式在 init 的時候就會先跟系統要一大塊記憶 體, 然後再自己分配就是為了這個原因. 比方說, Mud Server Merc 就是這麼作的. 但是 BCB 這個策略的問題在於, 它很容易讓 Memory leak detection program (比如說, CompuWare(原NuMega)的BoundsChecker) 被迷惑, 而通知你說有 memory leak... 另外一個問題是, 我記得 TMemoryManager 好像不會動態的, 適時適量的去歸還一些配置 空間. 換句話說, memory pool 是越長越大的. 因此, 這在某些特殊的情況也會造成一些 困擾. 最後, 我一直很希望 BCB 的 memory alloc function 能夠作到像 VC 那樣可以只靠 define 一些 macro 就可以模擬/追蹤各種記憶體配置時的狀況以用來除錯... 如果對 Memory Allocator 有興趣, 我建議你去看 Doug lea 的 DL Malloc 演算法. Linux中目前是直接套用這個 code, 而現代的memory alloc 演算法, 則或或少受到這個 方法很大的影響. 你可以到 http://gee.cs.oswego.edu/dl/ 去下載 DL Malloc source code. --- 小葵..小葵有很多的夢想 等待薰下班回家, 並準備晚飯跟洗澡水 薰回家的時候, 對你說一聲 歡迎回家 在休息的日子, 兩個人坐在屋外的走廊上, 品嚐著我親自作的點心 薰如果累了, 替他搥搥肩; 冷了, 和薰一起擠著被爐 但是, 但是... 小葵最大的心願是...成為薰的..成為薰的妻子 發表人 - miyu 於 2003/09/01 23:44:07
系統時間:2024-05-19 2:36:31
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!