Длинные строки

Длинные строки

Дискуссию о быстродействии алгоритмов нельзя считать законченной без краткого рассмотрения длинных строк. С ними связан целый ряд проблем, касающихся эффективности. Длинные строки появились в Delphi 2 и присутствовали во всех последующих компиляторах Delphi и Kylix (программисты, работающие в Delphi1, могут не беспокоиться о длинных строках и без последствий пропустить этот раздел).

Длинная строковая переменная string - это всего лишь указатель на специальным образом отформатированный блок памяти. Другими словами, sizeof(stringvar) - sizeof(pointer). Если указатель содержит nil, строка считается пустой. В противном случае указатель указывает непосредственно на последовательность символов, составляющих строку. Функции для работы с длинными строками в библиотеке времени выполнения гарантируют, что строка всегда завершается нулем (null-символом). Благодаря этому, строковую переменную всегда можно легко привести к типу PChar, используемому при вызове API-функций системы. Но, наверное, не все знают, что блок памяти, на который указывает указатель, содержит и некоторую дополнительную информацию. Четыре байта, расположенные до последовательности символов, представляют собой целочисленное значение - длину строки (за исключением завершающего нуля). Предшествующие четыре байта содержат целочисленное значение, представляющее собой счетчик ссылок (для постоянных строк это значение равно -1). Если память для строки выделена из кучи, то предшествующие четыре байта содержат целочисленное значение, представляющее собой полный объем используемого строкой блока памяти, включая все скрытые целочисленные поля, последовательность символов, составляющих строку, и скрытый завершающий null-символ, округленные до ближайших четырех байтов.

Счетчик ссылок присутствует в блоке памяти, поэтому операция

MyOtherString := MyString выполняется очень быстро. Компилятор преобразует это присвоение за два шага: сначала он увеличивает на 1 счетчик ссылок для строки, на которую указывает MyString, а затем устанавливает указатель MyOtherString равным указателю MyString.

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

Поделитесь на страничке

Следующая глава >

Похожие главы из других книг:

2.3.3.2. Длинные опции в стиле POSIX

Из книги автора

2.3.3.2. Длинные опции в стиле POSIX Стандарт POSIX резервирует опцию -W для специфических для производителя возможностей. Поэтому по определению -W непереносимо между различными системами.Если за W в аргументе optstring следует точка с запятой (обратите внимание не двоеточие), getopt_long()


Длинные и короткие имена файлов

Из книги автора

Длинные и короткие имена файлов Запрещение длинных имен файловВы можете запретить длинные имена файлов в Windows, заставив тем самым генерировать имена в формате 8.3 (DOS-овский формат). Для этого в разделе HKLMSystemCurrentControlSetcontrolFileSystemнадо изменить параметр °Win31FileSystem°, присвоив ему


Длинные линии

Из книги автора

Длинные линии Некоторые телефонные линии используют медные кабели диаметром 104 мм, которые состоят из 18 изолированных жил. Измеряемые параметры даны для линии длиной в одну милю: R = 10,15 Ом;L = 3,93 мГн;G = 0,29 мкс;С = 0,00797мкФ.Длина линии 200 миль. Рассмотрим, как уменьшаются ток и


Указатели и строки

Из книги автора

Указатели и строки      Возможно, вы заметили периодическое упоминание указателей в нашем рассказе о строках. Большинство операции языка Си, имеющих дело со строками, работает с указателями. Например, рассморим приведенную ниже бесполезную, но поучительную программу /*


Длинные строки

Из книги автора

Длинные строки Дискуссию о быстродействии алгоритмов нельзя считать законченной без краткого рассмотрения длинных строк. С ними связан целый ряд проблем, касающихся эффективности. Длинные строки появились в Delphi 2 и присутствовали во всех последующих компиляторах Delphi и


Символьные строки

Из книги автора

Символьные строки Символьная строка состоит из последовательности символов, заключенных в двойные кавычки. Эта последовательность представляется в памяти как массив элементов типа char. Символьная строка представляет в выражении адрес этого массива, т. е. адрес первого


Строки

Из книги автора

Строки CharPrev Функция CharPrev возвращает указатель на предшествующий символ в строке. Функция заменяет функцию AnsiPrev . LPTSTR CharPrev ( LPCTSTR lpszStart , // указатель на первый символ LPCTSTR lpszCurrent // указатель на текущий символ ); Параметры lpszStart - указатель на начало строки. lpszCurrent - указатель


2.4.2 Явно Заданные Длинные Константы

Из книги автора

2.4.2 Явно Заданные Длинные Константы Десятичная, восьмиричная или шестнадцатиричная констата, за которой непосредственно стоит l (латинская буква «эль») или L, считается длинной


2.5 Строки

Из книги автора

2.5 Строки Строка есть последовательность символов, заключенная в двойные кавычки: «...». Строка имеет тип «массив символов» и класс памяти static (см. #4 ниже), она инициализируется зданными символами. Все строки, даже если они записаны одинково, различны. Компилятор


Строки

Из книги автора

Строки Класс STRING описывает символьные строки. Он имеет специальный статус, поскольку нотация допускает манифестные строковые константы, обозначающие экземпляры STRING.Строковая константа записывается в двойных кавычках, например,"ABcd Ef ~*_ 01"Символ двойных кавычек должны


СОФТЕРРА: Длинные руки: Прикладной телекинез и никакой мистики. Часть 1

Из книги автора

СОФТЕРРА: Длинные руки: Прикладной телекинез и никакой мистики. Часть 1 Автор: Ралько, АндрейБывают ситуации, когда нужно оказаться у экрана компьютера, установленного в соседнем здании или расположенного за несколько сотен километров. Причины для этого могут быть разные


СОФТЕРРА: Длинные руки: Корпоративные системы удаленного управления. Часть 2

Из книги автора

СОФТЕРРА: Длинные руки: Корпоративные системы удаленного управления. Часть 2 Автор: Ралько, АндрейПродолжим начатую в предыдущем номере тему удаленного управления компьютером через сеть. Все продукты этого класса очевидным образом можно разделить на две группы: в первую