«Ни один ремесленник, который стремится к вершинам своей профессии, не примет негодных инструментов; и ни один производитель, который ценит качество работы, не будет упрашивать ремесленника принять их»
6. Строковые типы данных
Object Pascal поддерживает предопределенные строковые типы, представленные в таблице.
Тип |
Число символов |
Объем занимаемой памяти |
Назначение |
ShortString |
255 |
от 2 до 256 байт |
для обратной совместимости |
AnsiString |
около 231 |
от 4 байт до 2ГБ |
8-битовые символы ANSI |
WideString |
около 230 |
от 4 байт до 2ГБ |
символы Unicode; параметры методов интерфейсов в СОМ технологиях |
Строки AnsiString, называемые также длинными строками (long string), наиболее предпочтительны для большинства применений. Строковые типы могут смешиваться в операторах присваивания и выражениях. При этом компилятор автоматически выполняет требуемые преобразования. Однако при передаче в качестве var и out параметров подпрограмм они должны иметь соответствующий тип.
Строковые типы могут явно быть приведены к требуемому типу (typecast).
Зарезервированное слово string интерпретируется как идентификатор родового (generic) типа. Например, var S: string; вводит переменную строкового типа, которая по умолчанию {$H+} интерпретируется как AnsiString (когда она описана без взятого в скобки числа после нее – указания максимальной длины строки, например, string[80]). Директива {$H–} заставляет компилятор интерпретировать строку как ShortString. Стандартная функция Length возвращает длину строки, а процедура SetLength используется для задания длины строки. Сравнение строк выполняется по тем же правилам, что и в ВР.
Строку можно индексировать как массив, при этом тип S[i] тот же, что и тип S.
Короткие строки ShortString. Предназначены только для обратной совместимости, отчасти потому, что занимают в памяти всегда 256 байт независимо от фактического числа символов (если строка описана без задания максимального числа символов). Функция High возвращает максимальный размер строки, а Low – нуль.
Длинные строки AnsiString являются динамически размещаемыми строками, максимальная длина которых ограничена только имеющейся памятью. Переменная типа AnsiString является 4-байтовым указателем. Когда ее значение равно nil, строка является пустой и не занимает памяти. В противном случае ей выделяется требуемый объем динамической памяти (heap) автоматически, без участия программиста. Дополнительно в этой области динамической памяти хранится фактической число символов в строке (4 байта) и число ссылок на эту строку (тоже 4 байта).
Так как переменные AnsiString являются указателями, то на одну строку может ссылаться более одного указателя, что учитывается компилятором для экономии памяти. Когда переменная уничтожается или ей присваивается новое значение, то число указателей на старую строку уменьшается на 1 (reference-counting). Когда оно становится равным нулю, память автоматически освобождается. В то же время, когда строке присваивается новое значение (даже при изменении одного символа), то создается новая копия строки (copy-on-write semantics), но только в том случае, если на строку указывают более одного указателя.
Строки типа WideString. Они во многом подобны строкам AnsiString однако менее эффективны, так как код символа является 2-байтовым и для них не поддерживается технология многих указателей (reference-counting и copy-on-write semantics).
О расширенных наборах кодов символов. Windows поддерживает однобайтные (single-byte character set – SBCS) и многобайтные (multibyte character set – MBCS)) наборы символов наряду с Unicode. То же реализовано и в Delphi (подробности см. в документации).
«5. Типы данных»
7. Поддержка строк с завершающим нулем