| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Общие вопросы > Использование UniqueString |
| Автор: cemick 26.12.2009, 11:36 | ||||
| Наткнулся на тему http://stackoverflow.com/questions/1951192/delphi-performance-of-passing-const-strings-versus-passing-var-strings и вот такой пример
Мне не совсем понятно, что происходит и почему комментирование строчки UniqueString(s); приводит к ошибке:
Как я понимаю UniqueString гарантирует уникальность строки, просто копируя AnsiString строку в памяти. Const же параметр передается по ссылки, но компилятор следит за тем, что бы значение параметра не менялось и не передався ни кому указатель на строку, где она могла бы изменится. Не понятно, почему после UniqueString, константная строка ведет себя как объект. Вот как то так не понятно. |
| Автор: Amphiluke 26.12.2009, 12:27 | ||||
Так что, видимо, это не только UniqueString() касается.
|
| Автор: cemick 26.12.2009, 14:36 |
| UniqueString не просто копирует строку в памяти? А вносит какие то изменения, которые позволяют при p := PChar(Value); p[3] := '?'; определить что это уникальная строка? Ведь после s := 'var string'; количество ссылок на s тоже равно 1. Чем тогда отличается s от того, что получаем после UniqueString (s) |
| Автор: Amphiluke 26.12.2009, 15:27 | ||
Запись
указывает компилятору разместить строковую константу в области сегмента кода, доступной только для чтения. Приведение типа к PChar не обеспечивает копирования строки из сегмента кода в динамическую память, а просто заносит указатель на константу в переменную типа PChar, поэтому попытка изменения строки приводит к AV. А UniqueString как раз выполняет такое копирование в область памяти, доступную для изменения… Да, впрочем, что рассказывать: вот http://www.delphikingdom.com/asp/viewitem.asp?catalogid=1206 почитайте. |
| Автор: Amphiluke 26.12.2009, 16:15 | ||
| А вы посмотрели 5-й пример? Указатель, полученный с применением оператора @ указывает на область памяти, доступной для изменения. Следовательно, счетчик ссылок не равен -1. Попробуйте:
|
| Автор: cemick 26.12.2009, 16:40 | ||
UniqString_Const.pas.32: P := @s[1]; 0045A856 8D45F8 lea eax,[ebp-$08] 0045A859 E8E2A4FAFF call @UniqueStringA 0045A85E 8945F0 mov [ebp-$10],eax Во как оказывается, теперь все встало на свои места. Спасибо! Первый раз сталкиваюсь с областью "сегмент кода", поиск конечно же рулит, но может есть ссылки где можно поподробнее почитать об этом. |