Являются ли строки Delphi неизменными?

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

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

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

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

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

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

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

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

Изменить: версия Delphi является Delphi 7.0

4 ответа

Решение

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

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

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

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

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

Как уже говорили другие, строки 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

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

Другие вопросы по тегам