Строковое хранение

Несмотря на то, что концептуально CFString возражает строкам хранилища как массивам символов Unicode, на практике они часто хранят их более эффективно. Память, которой объект CFString требует для представления строки, могла часто быть меньше, чем требуемый простым UniChar массив.

Для неизменных строк эта эффективность возможна, потому что некоторые стандартные 8-разрядные кодировки символьного значения — а именно, ASCII и связанные кодировки, такие как латынь ISO 1 — являются подмножествами 16-разрядного представления Unicode того же значения. Со значениями символа ASCII в схеме Unicode, например, левые большинство восьми битов является нулями; право большинство восьми битов идентично тем в 8-разрядном кодировании. Если кодирование позволяет быстро (O (1)) преобразование в символы Unicode, строка возражает только попыткам этот сжатый тип хранения.

  Хранение рисунка 1 неизменного CFString произошло из кодирования ASCII
Storage of an immutable CFString derived from ASCII encoding

Непостоянные объекты CFString выполняют подобный тип оптимизации. Например, непостоянная строка могла бы иметь 8-разрядное запоминающее устройство, пока не вставляется символ выше диапазона ASCII.

Когда CFString копируется, объекты CFString выполняют другие «приемы» для сохранения памяти, такой как постепенное увеличение подсчета ссылок. Для больших строк они могли бы лениво загрузить их из файлов или ресурсов и сохранить их внутренне в структурах B-дерева.

Существует некоторая память, наверху связанная с объектами CFString. Это обычно колеблется от 4 до 12 байтов, в зависимости от характеристики переменчивости и платформы. Но сохраняющие память стратегии, используемые строкой, возражают больше, чем компенсируют эти издержки.

В дополнение к его механизмам внутренней памяти некоторые интерфейсы программирования строковых объектов предоставляют Вам владение запоминающего устройства строки или предоставляют Вам быстрый доступ к нему. Некоторые функции строковых объектов выбирают все сохраненные символы в локальный буфер или, для больших строк, позволяют Вам обрабатывать символы эффективно во встроенном буфере.

Большинство функций создания CFString копирует строку в предоставленном пользователями буфере к запоминающему устройству созданного объекта. В некоторых предварительных сценариях использования Вы могли бы счесть полезным обеспечить запоминающее устройство сами. Функции создания, содержащие NoCopy сделайте буфер пользователя запоминающим устройством и позвольте создаваемому объекту CFString указать на него. (См. рисунок 2 для иллюстрации этого.) NoCopy спецификатор, однако, является просто «подсказкой»; в некоторых случаях объект CFString мог бы скопировать содержание буфера в свою внутреннюю память.

Можно получить дальнейший контроль над запоминающим устройством строки с CFStringCreateMutableWithExternalCharactersNoCopy функция. Эта функция создает ссылку на непостоянный объект CFString, но позволяет Вам сохранять полное владение буфера Unicode содержание символов объекта; сам объект указывает на буфер как его запоминающее устройство. При изменении содержания буфера, просто необходимо уведомить объект. Посмотрите Непостоянные Строки С Клиентскими Буферами для больше на этом предмете.

Рисунок 2  CFString возражает и их запоминающие устройства
CFString objects and their backing stores