Являются ли строки Delphi неизменными? - PullRequest
6 голосов
/ 16 апреля 2009

Насколько я знаю, строки в Delphi неизменны. Я вроде понимаю, что значит, если вы делаете:

string1 := 'Hello';
string1 := string1 + " World";

Первая строка уничтожена, и вы получаете ссылку на новую строку «Hello World».

Но что произойдет, если у вас в коде одна и та же строка в разных местах?

У меня есть строковый хеш, назначенный для идентификации нескольких переменных, поэтому, например, «изменение» идентифицируется хеш-значением свойств этого изменения. Таким образом, мне легко проверить «изменения» на равенство.

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

Вопрос в том, как Delphi обрабатывает эти строки? Что я получу, если вычислить отдельные хэши для одной строки длиной 10 байт? Два блока памяти по 10 байт или две ссылки на один и тот же блок памяти?

Пояснение: Изменение состоит из некоторых свойств, считанных из базы данных, и генерируется отдельным потоком. Класс TChange имеет метод GetHash, который вычисляет хеш на основе некоторых значений (но не всех), полученных в виде строки. Теперь другие потоки получают изменения и должны сравнивать их с ранее обработанными изменениями, чтобы они не обрабатывали одно и то же (логическое) изменение. Следовательно, хеш и, поскольку они имеют отдельные экземпляры, вычисляются две разные строки. Я пытаюсь определить, будет ли реальным улучшением переход со строки на что-то вроде 128-битного хэша, или это будет просто напрасная трата времени.

Редактировать: Версия Delphi - Delphi 7.0

Ответы [ 4 ]

20 голосов
/ 16 апреля 2009

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

Строки Delphi не интернированы. Если вы создадите одну и ту же строку из двух отдельных разделов кода, они не будут совместно использовать одно и то же резервное хранилище - одни и те же данные будут сохранены дважды.

4 голосов
/ 16 апреля 2009

Строки Delphi не являются неизменяемыми (try: string1 [2]: = 'a'), но они подсчитываются и копируются при записи.

Последствия для ваших хэшей неясны, вам придется подробно описать, как они хранятся и т. Д.

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

2 голосов
/ 16 апреля 2009

Как уже говорили другие, строки Delphi не обычно неизменяемы. Вот несколько ссылок на строки в Delphi.

http://blog.marcocantu.com/blog/delphi_super_duper_strings.html

http://conferences.codegear.com/he/article/32120

http://www.codexterity.com/delphistrings.htm

1 голос
/ 16 апреля 2009

Может быть важно знать версию Delphi. Старый добрый Delphi BCL обрабатывает строки как копирование при записи, что в основном означает, что новый экземпляр создается, когда что-то в строке изменяется. Так что да, они более или менее неизменны.

...