2011-08-26 91 views
4

我有一大堆對象都有一個文件名存儲在裏面。所有文件名都在給定的基本目錄內(我們稱之爲C:\BaseDir\)。我現在考慮兩種選擇:德爾福字符串共享問題

  1. 店絕對路徑中的對象
  2. 存儲相對路徑的對象和存儲的基本路徑還

如果我理解德爾福字符串正確第二種方法將需要更少的內存,因爲基本路徑字符串共享 - 因爲我相同的字符串場傳遞給這樣所有對象:

TDataObject.Create (FBasePath, RelFileName); 

這個假設是真的嗎?內存中是否只有一個基本路徑的字符串實例?

如果有人知道更好的方式來處理這種情況,請隨時評論。

謝謝!

回答

6

你是對的。當你用兩個字符串變量寫s1:= s2時,內存中有一個字符串(至少有兩個)引用它。

你還會問,試圖減少內存中字符串的數量是個好主意。這取決於您與其他內存消耗對象相比有多少個字符串。只有你能真正回答。

2

正如大衛所說,共同的字符串將被共享(除非你使用ie,即UniqueString())。

話雖如此,它看起來像不成熟的優化。如果你實際上需要使用完整路徑並且不需要分別指定目錄和文件名部分,那麼只有當你遇到內存問題時才應該考慮將其分開。 不斷連接基本和文件名部分可能會顯着減慢程序並導致內存碎片。

+0

不成熟的優化,同意。但是,保持基路徑與相關基路徑分離的設計原因可能存在 - 例如,在全局範圍內更容易更改基路徑,同時保持所有相同的相對路徑與當前基路徑可能相同。但是在這種情況下,他可能最好將基本路徑保持爲單獨的全局字符串變量,並在每個文件訪問之前將對象中的相對路徑連接起來。 –