Delphi String Sharing Question - PullRequest
       5

Delphi String Sharing Question

4 голосов
/ 26 августа 2011

У меня есть большое количество объектов, внутри которых хранится имя файла. Все имена файлов находятся в данном базовом каталоге (назовем его C:\BaseDir\). Я сейчас рассматриваю две альтернативы:

  1. Хранить абсолютные пути в объектах
  2. Сохранить относительные пути в объекте и дополнительно сохранить базовый путь

Если я правильно понимаю строки Delphi, второму подходу потребуется гораздо меньше памяти, потому что строка базового пути является общей - учитывая, что я передаю одно и то же строковое поле всем объектам, как это:

TDataObject.Create (FBasePath, RelFileName);

Это предположение верно? Будет ли в памяти только один строковый экземпляр базового пути?

Если кто-нибудь знает лучший способ справиться с подобными ситуациями, не стесняйтесь комментировать это.

Спасибо!

Ответы [ 2 ]

6 голосов
/ 26 августа 2011

Вы правы.Когда вы пишете s1: = s2 с двумя строковыми переменными, в памяти остается одна строка с (как минимум двумя) ссылками на нее.

Вы также спрашиваете, является ли попытка уменьшить количество строк в памяти хорошейидея.Это зависит от того, сколько у вас строк по сравнению с другими объектами, занимающими память.Только ты действительно можешь ответить на этот вопрос.

2 голосов
/ 26 августа 2011

Как сказал Дэвид, общая строка будет общей (если вы не используете, например, UniqueString () ).

Сказав это, похоже на преждевременную оптимизацию. Если вам действительно нужно работать с полными путями и никогда не нуждаться в разделах dir и filename отдельно, вам следует подумать о разделении их только тогда, когда вы действительно столкнетесь с проблемами памяти. Постоянное объединение частей базы и имени файла может значительно замедлить вашу программу и вызвать фрагментацию памяти.

...