length - длина строки, или количество элементов массива. Это значение возвращается функцией Length.
refCnt счетчик ссылок.
sizeFlags содержит размер памяти и некоторые флаги. Это поле прямо никак не связано ни со строкой или массивом, а относится к распределению памяти.
Для строк и массивов использование полей этой структуры несколько отличается, но сам принцип одинаковый. Вот описание этих полей:
В начале выделяемой области памяти содержится заголовок, используемый системными функциями Delphi (определен в System.pas) для управления переменными обсуждаемых типов. Заголовок описывается записью TPvsDynRec. Вот ее описание:
И, наконец, компилятор заменяет почти все операции с этими переменными на свои системные функции.
Перед выходом из процедуры компилятор вставляет специальные функции финализации, ответственные за освобождение выделенной динамической памяти.
При присваивании длинным строкам значений или изменении размера массива компилятор вставляет код, динамически выделяющий область памяти, и присваивает указатель на нее этой переменной. То есть само содержимое строки или массива располагается в динамической памяти.
Переменная I, имеющая значение типа Integer, расположена в стеке и содержит случайный мусор. В отличие от переменной простого типа, для переменных S и A (являющихся указателями, также располагающимися в стеке), компилятор всегда вставляет код, инициализирующий их в nil.
Что показывает приведенный пример:
_DynArrayClear(A, typeinfo(TIntegerDynArray));
// Перед присваиванием...
Реализуемый компилятором код выглядит приблизительно так:
// Перед присваиванием...
Рассмотрим следующий код:
Для работы с ними компилятор генерирует и вставляет в код специальные функции. К таким типам, прежде всего, относятся длинные строки (AnsiString) и динамические массивы (далее будем называть их динамическими массивами, так как строку можно рассматривать как массив символов, а в дальнейшем нам потребуется некое общее название для этих типов).
ПРИМЕЧАНИЕВ данной статье речь по сути идет о Delphi версии 7 и ниже. В Delphi.NET все, что связано с массивами и строками основано на .NET Framework и можно говорить скорее об эмуляции поведения массивов и строк. Их реализация же совершенно отличается от того, что было в Delphi прошлых версий. прим.ред
Среди типов переменных в Delphi есть несколько типов, существенно отличающихся от обычных.
Длинные строки и динамические массивы в DelphiАвтор: Вишневский Павел Источник: Опубликовано: 12.12.2004Исправлено: 13.03.2005Версия текста: 1.0
Длинные строки и динамические массивы в Delphi P PP PP P PP PP PPPОценить P
Комментариев нет:
Отправить комментарий