Книги
чёрным по белому
Главное меню
Главная О нас Добавить материал Поиск по сайту Карта книг Карта сайта
Книги
Археология Архитектура Бизнес Биология Ветеринария Военная промышленность География Геология Гороскоп Дизайн Журналы Инженерия Информационные ресурсы Искусство История Компьютерная литература Криптология Кулинария Культура Лингвистика Математика Медицина Менеджмент Металлургия Минералогия Музыка Научная литература Нумизматика Образование Охота Педагогика Политика Промышленные производства Психология Путеводители Религия Рыбалка Садоводство Саморазвитие Семиотика Социология Спорт Столярное дело Строительство Техника Туризм Фантастика Физика Футурология Химия Художественная литература Экология Экономика Электроника Энергетика Этика Юриспруденция
Новые книги
Цуканов Б.И. "Время в психике человека" (Медицина)

Суворов С. "Танк Т-64. Первенец танков 2-го поколения " (Военная промышленность)

Нестеров В.А. "Основы проэктирования ракет класса воздух- воздух и авиационных катапульных установок для них" (Военная промышленность)

Фогль Б. "101 вопрос, который задала бы ваша кошка своему ветеринару если бы умела говорить" (Ветеринария)

Яблоков Н.П. "Криминалистика" (Юриспруденция)
Реклама

Эффективное использование STL. Библиотека программиста - Мейерс С.

Мейерс С. Эффективное использование STL. Библиотека программиста — Спб.: Питер , 2002. — 224 c.
ISBN 5-94723-382-7
Скачать (прямая ссылка): effektivnoeispolzovaniestlbibliote2002.djvu
Предыдущая << 1 .. 31 32 33 34 35 36 < 37 > 38 39 40 41 42 43 .. 114 >> Следующая

вариантах реализации stri ng. В выборе нет ничего особенного, все
варианты позаимствованы из широко распространенных реализаций STL. Просто
они оказались первыми, попавшимися мне на глаза.
В реализации А каждый объект string содержит копию своего распределителя
памяти, размер строки, ее емкость и указатель на динамически выделенный
буфер
72 Глава 2 • Контейнеры vector и string
со счетчиком ссылок (RefCnt) и содержимым строки. В этом варианте объект
string, использующий стандартный распределитель памяти, занимает в четыре
раза больше памяти по сравнению с указателем. При использовании
нестандартного указателя объект string увеличится на размер объекта
распределителя.
RefCnt I Содержимое^ h \
Распределитель
Размер
Емкость
Указатель
Объект string
Реализация А
В реализации В объекты string по размерам не отличаются от указателей,
поскольку они содержат указатель на структуру. При этом также
предполагается использование стандартного распределителя памяти. Как и в
реализации А, при использовании нестандартного распределителя размер
объекта string увеличивается на размер объекта распределителя. Благодаря
оптимизации, присутствующей в этом варианте, но не предусмотренной в
варианте А, использование стандартного распределителя обходится без
затрат памяти.
В объекте, на который ссылается указатель, хранится размер строки,
емкость и счетчик ссылок, а также указатель на динамически выделенный
буфер с текущим содержимым строки. Здесь же хранятся дополнительные
данные, относящиеся к синхронизации доступа в многопоточных системах. К
нашей теме они не относятся, поэтому на рисунке соответствующая часть
структуры данных обозначена "Прочее".
Указатель > Размер
Объект string Емкость
RefCnt
Указатель > Содержимое^
Прочее
Реализация В
Блок "Прочее" оказался больше остальных блоков, поскольку я постарался
выдержать масштаб изображения. Если один блок вдвое больше другого,
значит, он занимает вдвое больше памяти. В реализации В размер данных
синхронизации примерно в шесть раз превышает размер указателя.
В реализации С размер объекта stri ng всегда равен размеру указателя, но
этот указатель всегда ссылается на динамически выделенный буфер,
содержащий все данные строки: размер, емкость, счетчик ссылок и текущее
содержимое. Распределители уровня объекта не поддерживаются. В буфере
также хранятся данные, описывающие возможности совместного доступа к
содержимому; эта тема здесь не рассматривается, поэтому соответствующий
блок на рисунке помечен буквой "X" (если вас интересует, зачем может
потребоваться ограничение доступа к данным с подсчетом ссылок, обратитесь
к совету 29 "More Effective C++"),
Совет 15 73
Размер Емкость RefCnt X Содержимое^ ^
Указатель
Объект string
Реализация С
В реализации D объекты string занимают в семь раз больше памяти, чем
указатель (при использовании стандартного распределителя памяти). В этой
реализации подсчет ссылок не используется, но каждый объект stri ng
содержит внутренний буфер, в котором могут храниться до 15 символов.
Таким образом, небольшие строки хранятся непосредственно в объекте stri
ng - данная возможность иногда называется "оптимизацией малых строк".
Если емкость строки превышает 15 символов, в начале буфера хранится
указатель на динамически выделенный блок памяти, в котором содержатся
символы строки.
Распределитель
Содержимое
Размер
Емкость
Распределитель
Указатель > Содержимое^
Неиспользуемая;; С; .-, часть; /. буфера
Размер
Емкость
Объект string Объект string
(емкость <15) (емкость >15)
Реализация D
Я поместил здесь эти диаграммы совсем не для того, чтобы убедить читателя
в своем умении читать исходные тексты и рисовать красивые картинки. По
ним также можно сделать вывод, что создание объекта string командами вида
string s("Perse"): // Имя нашей собаки - Персефона. но мы // обычно зовем
ее просто "Перси"
в реализации D обходится без динамического выделения памяти, обходится
одним выделением в реализациях А и С и двумя - в реализации В (для
объекта, на который ссылается указатель stri ng, и для символьного
буфера, на который ссылается указатель в этом объекте). Если для вас
существенно количество операций выделения/освобождения или затраты
памяти, часто связанные с этими операциями, от реализации В лучше
держаться подальше. С другой стороны, наличие специальной поддержки
синхронизации доступа в реализации В может привести к тому, что эта
реализация подойдет для ваших целей лучше, чем реализации А и С, а
количество динамических выделений памяти уйдет на второй план. Реализация
D не требует специальной поддержки многопоточности, поскольку в ней не
используется подсчет ссылок. За дополнительной информацией о связи между
многопоточностью и строками с подсчетом ссылок обращайтесь к совету 13.
Типичная поддержка многопоточности в контейнерах STL описана в совете 12.
В архитектуре, основанной на подсчете ссылок, все данные, находящиеся за
Предыдущая << 1 .. 31 32 33 34 35 36 < 37 > 38 39 40 41 42 43 .. 114 >> Следующая