線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1805
推到 Plurk!
推到 Facebook!

有關SetLength的記憶體管理問題

答題得分者是:ddy
00156
高階會員


發表:45
回覆:195
積分:112
註冊:2002-06-01

發送簡訊給我
#1 引用回覆 回覆 發表時間:2002-11-19 20:06:40 IP:61.56.xxx.xxx 未訂閱
請教各位先進: 當一個動態陣列改變索引值大小時(由大改小),原本陣列所佔用的記憶體空間是否立即歸還給系統?若是,零碎斷離的記憶空間是否會延遲程式執行效率? 同樣道理,增加該陣列大小也可能造成斷離的空間使用,會不會同樣影響效能? 謝謝!
ddy
站務副站長


發表:262
回覆:2105
積分:1169
註冊:2002-07-13

發送簡訊給我
#2 引用回覆 回覆 發表時間:2002-11-20 10:33:35 IP:210.64.xxx.xxx 未訂閱
00156
高階會員


發表:45
回覆:195
積分:112
註冊:2002-06-01

發送簡訊給我
#3 引用回覆 回覆 發表時間:2002-11-20 17:02:10 IP:61.56.xxx.xxx 未訂閱
感謝版主的資料。先前我也去看過,不過仍然不了解Delphi如何配置記憶體的,以及對程式效率的影響(不知道TMemory那個例子和SetLength有否不同?能不能製造斷離的記憶體?)。如果有相關的訊息,還請各位多多提供~
ddy
站務副站長


發表:262
回覆:2105
積分:1169
註冊:2002-07-13

發送簡訊給我
#4 引用回覆 回覆 發表時間:2002-11-20 22:44:00 IP:211.74.xxx.xxx 未訂閱
var
    a:array of Integer;
begin
    SetLength(a,5);
    a[5]:=5;
    SetLength(a,3);
    a[5]:=9;
    self.Caption :=IntToStr(a[5]);
end;
上面這個小程式,將一動態陣列由大改小,可是如果程式仍存取原範圍的值 ,仍然可以存取原陣列的資料,由此可之,SetLength 如果將array 縮小,原 資料仍然存在於記憶體中,可見此部份並未被系統清空,卻不在程式正常的操作範圍內我們以High / Length 取得的都是改變後的大小。至於這些空間就屬於系統自由使用的空間了,或許會有零碎的,OS 會處理這一切的 此網址http://delphi.ktop.com.tw/topic.php?TOPIC_ID=19726 是我之前發表的記憶體釋放程式,其原理就是利用SetLength 改變動態陣列的大小,當我要釋放一個128mb 的空間時,就SetLength 128MB 的陣列,取得此空間後,再改變至SetLength 10MB縮小陣列,其餘的118MB 仍然在OS 手裡控管,所以setlength 陣列由大-->小,一般狀況下是不會影響系統效能,除非零碎的片段記憶空間太多,致使系統無可用空間時,才有可能影響程式效率(這些都是OS 該做的) 以上小小看法,如果其它先進發現我觀念有誤,尚請指教 噓~~~~~~沉思中… 發表人 - ddy 於 2002/11/20 22:46:36
系統時間:2024-05-06 0:54:47
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!