我的應用程序根據文件名(包括其他基於字符串的信息)在內存中構建了很多對象。我希望通過分別存儲路徑和文件名來優化內存使用,然後在同一路徑中的對象之間共享路徑。我沒有試圖看看使用字符串池或任何東西,基本上我的對象被排序,所以如果我有10個對象具有相同的路徑我希望對象2-10的路徑「指向」對象1的路徑(例如對象[2]。路徑=對象[1]。路徑);我認爲我告訴他們(通過對象[2] .Path = object [1]),我不相信我的對象事實上共享對同一個字符串的引用。 .Path分配)。Delphi中對象的字符串共享/引用問題
當我用字符串列表進行實驗並將所有值設置爲列表中的第一個值時,我可以看到「內存保護」的作用,但是當我使用對象時,我完全沒有看到任何變化,我承認我只使用任務管理器(私人工作集)來觀察內存使用的變化。
這是一個人爲的例子,我希望這是有道理的。
我有一個對象:
TfileObject=class(Tobject)
FpathPart: string;
FfilePart: string;
end;
現在我創建對象100萬分的情況下,使用每一個新的字符串:
var x: integer;
MyFilePath: string;
fo: TfileObject;
begin
for x := 1 to 1000000 do
begin
// create a new string for every iteration of the loop
MyFilePath:=ExtractFilePath(Application.ExeName);
fo:=TfileObject.Create;
fo.FpathPart:=MyFilePath;
FobjectList.Add(fo);
end;
end;
運行這件事和任務經理說我使用68MB的內存什麼的。 (請注意,如果我在循環之外分配了MyFilePath,那麼由於字符串的一個實例,我確實節省了內存,但這是一個人爲的例子,實際上並不是在應用程序中發生的情況)。
現在我想通過使所有對象共享的路徑字符串的同一實例「優化」我的內存使用情況,因爲它是相同的值:
變種X:整數;對於x:= 1到FobjectList.Count-1做 開始 做 開始 TfileObject(FobjectList [x])。FpathPart:= TfileObject(FobjectList [0])。FpathPart; 結束; 結束;
任務管理器顯示沒有變化。
但是,如果我做一個的TStringList類似的事情:
var x: integer;
begin
for x := 1 to 1000000 do
begin
FstringList.Add(ExtractFilePath(Application.ExeName));
end;
end;
任務管理器說60MB的內存使用。
現在與優化:
var x: integer;
begin
for x := 1 to FstringList.Count - 1 do
FstringList[x]:=FstringList[0];
end;
任務管理器顯示內存使用量的下降,我所期望的,現在10MB。
所以我似乎能夠在字符串列表中共享字符串,但不能在對象中共享字符串。我明顯錯過了一些概念上的代碼或兩者!
我希望這是有道理的,我真的可以看到使用這種技術來節省內存的能力,因爲我有很多對象都有大量的字符串信息,數據以許多不同的方式排序,我希望成爲能夠在將這些數據加載到內存中後迭代這些數據,並通過以這種方式共享字符串來再次釋放部分內存。
在此先感謝您提供的任何幫助。
PS:我用Delphi 2007,但我剛剛測試了德爾福2010年,其結果都是一樣的,不同的是德爾福2010使用兩倍的內存,由於unicode字符串...
感謝mghie,這解釋了由於TstringList和對象之間的不同行爲而導致的答案。 – Jenakai 2010-03-14 00:18:30