Главная » Просмотр файлов » Б. Страуструп - Язык программирования С++. Специальное издание, 3-изд. Бином. 2004

Б. Страуструп - Язык программирования С++. Специальное издание, 3-изд. Бином. 2004 (1160791), страница 141

Файл №1160791 Б. Страуструп - Язык программирования С++. Специальное издание, 3-изд. Бином. 2004 (Б. Страуструп - Язык программирования С++. Специальное издание, 3-изд. Бином. 2004) 141 страницаБ. Страуструп - Язык программирования С++. Специальное издание, 3-изд. Бином. 2004 (1160791) страница 1412019-09-19СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

Текст из файла (страница 141)

//- ); Поскольку 1.!пй — член Ия1, он параметризуется распределителем памяти. Поэтому объекты б!п/г из контейнеров Ия1с разными распределителями памяти принадлежат к разным типам, точно так же, как и сами контейнеры Ия1 Я 17.3.3). 19.4.2. Распределители памяти, определиемые пользователем Те, кто реализует контейнеры, часто применяют к объектам операции айоса1е() или Иеайоса1е () «по одному объекту за раз >.

При наивной реализации айоса1е () это подразумевает много вызовов оператора пего, а не все реалсьзации оператора пеш эффективны при подобном использовании. Как пример определяемого пользователем распределителя памяти, я приведу схему использования пулов с участками памяти фиксированного размера, нз которых распределитель может выделять память при помощи аИоса1е () эффективнее, чем более распространенный и универсальный оператор пего (). Мне случилось столкнуться с распределителем из пула, который делал в общемто правильную вещь, но имел неправильный интерфейс (так как был разработан за несколько лет до того, как придумали распределители памяти). Тот класс Роо( реализовывал понятие о пуле с элементами фиксированного размера, в котором пользователь мог быстро выделять память и освобождать ее.

Это был низкоуровневьш тип, работавший напрямую с памятью и заботящийся о выравнивании: с!аяя Роо! ( яггис1 Тлп!г ( Й!ой«пех1; ); яггис1 Сбипй ( //Сбипб — кусок, участок епит (я!ге = В'!07>1-!б ), О немного меньше 8 К чтооы уложиться в В К сбаг тет(я!ге) //сначала резервируем облвсть па>сопи Сбип!с* пех1; // (чтобы обеспечить строгое выравнивание) Сбип!с* сйипйя; ббб // защита от копирования. //защита от копирования // увеличение пула // и — эгло размер элементов ооЫ' а!!ос (); ооЫ/гее (оо1тр Ь); гл!ие поЫ*Роо1 за Нос () !/ (йеас1==0) углю (); Е!ий* р = Йеас(; йеас! = р->пех1. ге1игп р; // возвратить первый элемент Ы1те оо!дроо!аггее (ооЫ*Ь) ( Есп й' р = яса11с саягсЕ!лй > (Ь)г р->пех1 = йеас(; // полгестгггггь Ь обратно как первый элемент йеад =р; ) Роо!кроо! (ипз!улес! т1ях) евсее (эх<я!еео/(!лай*) У ясеео/(Етй*): яе) ( йеад=О; сйиийя=б; ) ' // высвобождение всех кусков !сйгглйя) Роо1э-Роо! () ( // выделяет посиять под новый кусок, организуя его // как связный список элеменпгов размера евсее ооЫ Ров!тдгоьэ () ( Сйипй'и = лев Сйиай; и->пех1 = сйиийя,' сйипйя = и; сопя! т1 пе!ет = Сйипйьясхе/ея!хе; сйаГ ятагт = и->тет; сйаг* !аят = бягагг[ (не!ет — !)*ея1хеУ сои я1 ипя!Олей т1 евсее; Етй* йеад, Роо1(РооК)г или! орег"асог.= (Роо!с ); иоЫугоьэ (); риЫсс: Роо! (иле!алей !п1 п); -Роо1 (), Сйипй' и = сйипйя; ай!!е (л) ( Сйипй* р = и; л = а — >пех1; с!е!е1е р; Глава 19.

Итераторы и распределители памяти // выделение памяти под один элемент // помещение элемента обратно в иул 637 ! 9.4. Распределители памяти Еог (с)еаг* р = я1аг1; р<ГазЕ; рдея!хе) ге(п1егрге1 саз1<ЕГп)г*> (р)->пех1 = ге!п1егрге1 саз1<Е!пп> (рьетхе); гетгегргег сая1<Т!п)г" > (ГаяЕ)- пех1 = 0; Гееа<Г= гетЕегрге1 саз1<ЕГп)г*> (згагЕ) Чтобы добавить чуть-чуть реализма, я буду использовать Роо! неизменным как часть реализации моего распределителя памяти и не буду переписывать его, чтобы ввести правильный интерфейс. Распределитель памяти из пула предназначен для быстрого выделения и высвобождения памяти под один элемент, и это именно то, что мой класс Роо! поддерживает. Расширение этой реализации для выделения памяти под произвольное число обьектов и для объектов произвольного размера (как того требует геЬГпсГ) я оставлю в качестве упражнения (9 )9.6(91).

Имея Рос(, определение распределителя Роо! а!!ос становится тривиальным: Гетр(асе<с(озч Т с(аяяроо! аПос ( рг(оаЕе: зтайс Роо! тет; // пул элелентояраэлерол ялгео/ГТ) рибйс: // аналогично стандартному распределителю паилти (Э' ! 9 4. Г) Еетр(а(е<с(азз Т> Роо)роо! айос<Т стет (зГхеоД(!))' Гетр(а1е<с(азз Т> Рос( а!Гос<Т зроо! айос () () 1етр!а1е<с)азз Т Т'Роо! айос<Т:аПоса1е(з)ее 1уре п,оо(ср=0) ( Ц (и == !) ге!игл з1адс саз1<Т'>(тет аНос()); 1етр(а1е<с(аяз Т> оо!с!Рос! айос<Т эдеаПоса1е (ро)п1егр, тге Едрен) ( !/ (п == !) ( те т/гее (р); ге1игп (); О.

) Теперьэтот)эасп еделитель памяти можно испо.льзовать очевидным об азом: 638 Глава 19. Итераторы и распределители памяти памяти, как с одним и тем же. Это может привести к значительным преимуществам в быстродействии. Например, из-за этого ограничения не нужно оставлять память для распределителей в объектах йп!е 1которые обычно параметризуются распределителем памяти контейнера, связями 1(шЬ) в котором они являются), и операции, которые мо!ут выполнять доступ к элементам двух последовательностей 1такис как яшар ()), не обязаны проверять, все ли участвующие объекты имеют один и тот же распределитель памяти. Однако это ог1эаничение па самом деле приводит к тому, что такие распределители не могут использовать данные конкретного объекта.

Прежде чем применять такой способ оптимизапии, убедитесь в необходимости этого. Я полагаю, что многие распределители по умолчанию будут реализовывать в точности этот тип классической оптимизации в С++, что избавит вас от лишних хлопот.. 19.4.3. Обобщенные распределители памяти Распределитель памяти — зто упрощенный и оптимизированный вариант идеи о задании контейнеру информации в виде параметра шаблона Я 13.4,1, з 1б.2.3). Например, имеет смысл потребовать, чтобы каждый элемент в контейнере размещался распределителем памяти этого контейнера.

Однако, если двум спискам 1!я! одн ого и того же типа позволить иметь разные распределители памяти, то операция яр1!се () (удалить-вставить) не может быть реализована посредством «пересылки> одного списка на другой. Вместо этого яр!!се () пришлось бы копировать элементы для учета тех редких случаев, когда мы хотим объединить элементы из списка 1!я! с одним распределителем памяти с другим списком того же самого типа, но с другим распределителем памяти. Подобным же образом, если распределителям памяти позволить стать совершенно универсальными, механизм гев!лс! (), позволяющий распределителю памяти размещать элементы произвольных типов, пришлось бы сделать более изощренным.

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

Если нужны разные данные, можно воспользоваться разными типами распределителей. Например; !етр1а!е с!аяя Т, с1аяя Р> с!аяя Му а1!ос [ //распределитель пажятн для Т, // реализованный с использовиниеи 0 РЫ; //данные, нужниедлнту а11ос<Т,Р> !урес!еТМу а!!ос<!пг, Регягя!еп! !и/о> Реев!я!епг; !урес!е!Му айос<т1, Б!сагед !и/о> Б!1аге«1; !урес!е/Му а!!ос<!а!, Редаи!! !п/о> Ре/аи!1; 1!я!<!пг, Регя1яеепг> !я!1; !!я!<!и1, Зйагес!> !я!2; !гз1<тй Ре/аи1!> !я!д, 639 19.4.

Распределители памяти Списки 1я!1, 1я!2 и 1в!3 относятся к разным типам. Поэтому, оперируя двумя из этих списков, мы должны использовать универсальный алгоритм (глава 18), а не специализированные операции со списками (З 17.2.2.1). Это приводит к тому, что происходит копирование, а не перессылка, так что наличие разных распределителей памяти не вызывает проблем. Ограничение против данных на уровне объекта введено из-за строгих требований к эффективности стандартной библиотеки в смысле быстродействия и памяти.

Например, расходы памяти на данные распределителя для списка, вероятно, не так уж значительны, однако они могут стать серьезными, если затраты внесет каждая связь в списке. Рассмотрим, как прием с распределителем памяти можно использовать, если отказаться от ограничений эффективности для стандартной библиотеки. Это может пригод!иться для нестандартной библиотеки, от которой не требуется высокого быстродействия для каждой структуры данных и каждого типа в программе, а также для некоторых специальных реализаций стандартной библиотеки. В таких случаях распределитель памяти можно использовать лля хранения той информации, которая часто содержится в универсальных базовых классах (9 18.2.2). Например, распределитель памяти можно разработать так, чтобы он отвечал на запросы о том, где располагается объект, предоставлял данные о его структуре и отвечал на вопросы вроде «содержится ли этот элемент в этом контейнере? > Оп мог бы также обеспечтп ь контроль над контейнером, который действует в качестве каша для информации в постоянной памяти, обеспечить ассоциативную связь между контейнером и другими объектами и т.

Характеристики

Тип файла
DJVU-файл
Размер
10,02 Mb
Тип материала
Высшее учебное заведение

Список файлов книги

Свежие статьи
Популярно сейчас
Как Вы думаете, сколько людей до Вас делали точно такое же задание? 99% студентов выполняют точно такие же задания, как и их предшественники год назад. Найдите нужный учебный материал на СтудИзбе!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
6381
Авторов
на СтудИзбе
308
Средний доход
с одного платного файла
Обучение Подробнее