Показать сообщение отдельно
Старый 10.07.2010, 12:46   #24
Рыцарь
 
Аватар для alexteam
 
Регистрация: 07.03.2009
Сообщений: 9,139
Сказал Спасибо: 70
Имеет 2,820 спасибок в 1,735 сообщенях
alexteam на пути к лучшему
По умолчанию

Открою секрет. л2пх тоже написано на делфи %)
делфийской строке - похрен сколько у тебя #0#0 в строке встречается.
ибо там не просто "массив" байт. перед ним еще и структура есть в которой один из параметров - длина строки.

Цитата:
Вот что представляет собой эта область памяти, хранящая экземпляр строки 'abc':

Байты с 1 по 4 Счётчик ссылок равный -1
Байты с 5 по 8 Длина строки равная 3
Байт 9 Символ 'a'
Байт 10 Символ 'b'
Байт 11 Символ 'c'
Байт 12 Символ с кодом 0 (#0)

Для удобства работы с такой структурой, когда строковой переменной присваивается ссылка на эту строку, в переменную заносится адрес не начала этой структуры, а адрес её девятого байта. Т.е. адрес начала реальной строки (прямо как pChar). Для того, что бы приблизиться к реальной жизни, перепишем приведённую структуру:
Смещение Размер Значение Назначение
-8 4 -1 Счётчик ссылок
-4 4 3 Длина строки
0 1 'a'
1 1 'b'
2 1 'c'
3 1 #0

С полем по смещению -8, нам уже должно быть все ясно. Это значение, хранящееся в двойном слове (4 байта), тот самый счетчик, который позволяет оптимизировать хранение одинаковых строк. Значение этого счетчика имеет тип Integer, т.е. может быть отрицательным. На самом деле, используется лишь одно отрицательное значение – "-1", и положительные значения. 0 не используется.

Теперь, обратите внимание на поле, лежащее по смещению -4. Это, четырёхбайтовое значение длинны строки (почти как в ShortString). Думаю, Вы заметили, что размер памяти выделенной под эту строку не имеет избыточности. Т.е. компилятор выделяет под строку минимально необходимое число байт памяти. Это конечно хорошо, но, при попытке "нарастить" строку: s1 := s1 + 'd', компилятору, точнее библиотеке времени исполнения (RTL) придется перераспределить память. Ведь теперь строке требуется больше памяти, аж на целый байт. Для перераспределения памяти нужно знать текущий размер строки. Вероятно, именно для того, что бы не приходилось каждый раз сканировать строку, определяя её размер, разработчики Delphi и включили поле длины, строки в эту структуру. Длина строки, хранится как значение Integer, отсюда и ограничение на максимальный размер таких строк – 2 Гбайт. Надеюсь, мы не скоро упрёмся в это ограничение. Кстати, именно потому, что память под эти строки выделяется динамически, они и получили ещё одно свое название: динамические строки.
источник
http://sources.ru/magazine/0804/delphistr.html

Добавлено через 2 минуты
к стати, там очень неплохо описано что происходит с разнообразными типами в памяти при операциями над ними.

Добавлено через 5 минут
а вот собственно практическое подтверждение этому:

delphi Код:
var   Test : string;   len : integer; begin   test := 'HelloWorld!';   CopyMemory(@len,pointer(integer(test)-4),4);//копируем данные с участка памяти лежащего на 4 байта "левее" чем то куда ссылаеццо указатель на строку в участок памяти по которому лежит переменная len   showmessage(inttostr(len));//показываем len end;
__________________
L2Ext - project closed.

Последний раз редактировалось alexteam, 10.07.2010 в 14:28. Причина: Добавлено сообщение
alexteam вне форума   Ответить с цитированием