Главная » Free Pascal » Строки типа AnsiString Free Pascal

0

Стандарт строк, утвержденных американским национальным институтом стан- дартов (American National Institute Standards, ANSI), довольно широко распростра- нен в современных системах программирования. Его активно использует одна из лучших сред визуального программирования — Delphi. Этот тип данных включен и в состав языка Free Pascal. Главное преимущество строк типа AnsiString по сравнению

с короткими строками — отсутствие каких-либо ограничений на длину обрабаты- ваемых данных. Но это преимущество имеет и обратную сторону медали — работа с динамически выделяемой памятью сопряжена со значительными накладными расходами. Как только переменной такого типа присваивается очередное значение, имеющее длину, отличную от длины предыдущего значения, приходится возвра- щать ранее занимаемый ресурс и выделять место под новое значение переменной. Это неизбежно приводит к появлению разрозненных освобожденных участков па- мяти, выполнению дополнительных работ по "уборке мусора" и, как следствие, к замедлению работы программы.

Как правило, строки неограниченной длины объявляются с помощью служеб- ного слова AnsiString:

var

as: AnsiString;

В момент объявления такой строки компилятор выделяет 4 байта для хранения указателя на соответствующее значение и заносит туда ссылку на константу Nil. Это означает, что строка пока что пуста. Это правило распространяется как на гло- бальные, так и на локальные Ansi-переменные, а также на поля записей того же ти- па. Оперативная память для хранения длинных строк выделяется в "куче" в момент присвоения переменной as первоначального или очередного значения. С этим зна- чением связывается еще и счетчик ссылок (reference count), в котором фиксируется количество Ansi-переменных, использующих в текущий момент это значение. Ко- гда Ansi-переменная перестает быть активной (выходит из "области видимости") из счетчика ссылок вычитается 1. Если с этим значением была связана единственная Ansi-переменная, то в момент ее активного существования в счетчике ссылок на- ходилась единица. С потерей активности и появлением нуля в счетчике ссылок со- ответствующий участок кучи освобождается, а указатель пассивной переменной сбрасывается в Nil.

Разницу в тактике выделения и освобождения памяти под короткие и длинные

строки демонстрирует программа Ansi_1 (листинг 5.11).

   Листинг 5 .1 1 .  Программа  Ansi_1                                              

program Ansi_1; var

as1: AnsiString=’Hello, world!'; ss1: String[20]=’Hello, world!';

begin

writeln(‘SizeOf(as1) = ‘,SizeOf(as1)); writeln(‘Length(as1) = ‘,Length(as1)); as1:=";

writeln(‘SizeOf(as1) = ‘,SizeOf(as1)); writeln(‘Length(as1) = ‘,Length(as1)); writeln(‘SizeOf(ss1) = ‘,SizeOf(ss1));

writeln(‘Length(ss1) = ‘,Length(ss1)); ss1:=";

writeln(‘SizeOf(ss1) = ‘,SizeOf(ss1)); writeln(‘Length(ss1) = ‘,Length(ss1)); readln;

end.

Результаты ее работы приведены на рис. 5.10. Обратите внимание, что незави- симо от длины текущего значения под переменную ss1 выделен 21 байт, тогда как после опустошения длинной строки as1 от нее остался только четырехбайтовый указатель.

Рис. 5.10. Объемы занимаемой памяти и длины значений

Особым способом обрабатываются константы типа AnsiString: const

cas: AnsiString=’Hello, world!';

В счетчик ссылок каждой такой константы заносится –1, что в машинном пред- ставлении для чисел без знака (счетчик ссылок — всегда число не отрицательное) соответствует максимально допустимому значению. Это позволяет хранить значе- ния Ansi-констант до конца выполнения программы, т. к. сбросить такой счетчик до нуля практически не реально.

Второй способ причисления строк к типу AnsiSting связан с включением ди- рективы {$H+}. В этом режиме строки, объявленные с помощью служебного слова String без указания максимальной длины, тоже рассматриваются компилятором как данные типа AnsiString:

{$H+}

var

s1: String[20];       {строка типа ShortString} s2: String;           {строка типа AnsiString}

Над значениями строк неограниченной длины можно выполнять все те же опе- рации, что и над короткими строками. Значения строк типа AnsiString можно при- сваивать переменным типа ShortString с естественным обрезанием результата по максимальной длине короткой переменной. Без каких-либо ограничений разреше- ны обратные присвоения.

Кроме того, в модуле StrUtils предусмотрено порядка 90 дополнительных функций и процедур для обработки строк типа AnsiString.

Источник: Кетков, Ю. Л., Свободное программное обеспечение. FREE PASCAL для студентов и школьников, Ю. Л. Кетков, А. Ю. Кетков. — СПб.: БХВ-Петербург, 2011. — 384 с.: ил. + CD-ROM — (ИиИКТ)

По теме:

  • Комментарии