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

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

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

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

Однако, иногда применение проверок во время выполнения действительно ведет к значительным затратам времени и памяти, так что настаивать па них не реалистично. Но, во всяком случае, не очень мудро оптимизировать программуу, не проводя измерений, так что прежде чем удалять проверочный код, проведите эксперимент и посмотрите, действительно ли стоит подобным образом улучшать программу. Чтобы провести такой эксперимент, мы должны иметь возможность легко удалять проверки, предназначенные для времени выполнения (см, 9 24.3.7.1).

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

Однако оно не помогает нам легко избавиться от них. Люди редко пишут программы, которые на 100% нечувствительны ко всем++, —, *, П, -> и =, потенциально генерирующим исключения, Это оставляет нам две очевидные стратегии; 111 Перехватывать (сагой) исключения рядом с точками, в которых они генерируются, чтобы обработчик исключений имел шанс узнать, в чем ошибка и предпринять соответствующие действия. 121 Перехватывать исключения на верхнем уровне программы, прерывая изрядную долю вычислений и оставляя под подозрением все структуры данных, участвовавшие в неудавшемся вычислении (таких структур данных может не оказаться, или их благонадежность можно проверить).

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

Это может служить примером упрощения, возможного благодаря схеме ' многоуровневого восстановления после ошибок Я 14.9). 19,4. Распределители памяти Распределитель памяти (аПоса1 ог) используется, чтобы отделить разработчика алгоритмов и контейнеров, которые должны выделять память, от подробностей физической организации памяти. Распределитель памяти обеспечивает стандартные способы выделения н перераспределения памяти, а также стандартные имена типов для указателей и ссылок. Подобно итератору распределитель памяти — это чистая абст- Глава 19. Итераторы и распределители памяти ракция. Любой тип, ведущий себя, как распределитель памяти, является распределителем памяти.

Стандартная библиотека обеспечивает стандартный распределитель памяти, предназначенный для того, !тобы хорошо служить большинству пользователей данной реализации Кроме того, пользователь может обеспечить свои распределители памяти, предоставляющие альтернативный доступ к памяти. Например, мы можем написать распределители памяти, работающие с разделяемой памятью, памятью со сборкой мусора, памятью из заранее выделенного пула объектов (6 19А.2) и т. д.

Стандартные контейнеры и алгоритмы получают память и обращаются к ней через средства, обеспечиваемые распределителем памяти. Таким образом, предоставляя новый распределитель памяти, мы обеспечиваем стандартные контейнеры способом использования новых видов памяти. 19.4.1. Стандартный распределитель памяти Стандартный шаблон аПоса1ог из заголовочного файла <тетогд> выделяет память при помощи оператора пего () Я 6.2.6) и по умолчанию используется всеми стандартнымнконтейнерами: 1етр!а1е<с!аяз Т> Маья аИоса1ог ( риЫ!с 1урейе/Т оа!ие 1уре; !урейе/я!ее ! я(ее 1уре; 1урейе~р!яйся 1 Й~Дегепсе 1уре; 1урейеТ Т' рога!ее; 1урейе~сопз! Т' сопи1 рот 1ег; 1урейе~тй ге~егепсе, 1урейе/сопя1 Тй сопз1 ге/егепсе; ро(п! ег аййгеяя (ге~егепсе и) сонь! ( ге1ш п йп ) сопзгро!п1ег аййгеяя (соль! ге~егепсе ь) сопи1( ге1игп йг; ) аИоса1ог () Ип ош (); !етр!а1е<с!азя Г!> аИоса1ог(сопя! аИоса1ог<13>й) !Ьгот (); -аПоса1ог() !Ьгов (); // память для п объектов Т рот1егауоса1е (яссе 1уре п, апоса1ог<иоЫ>ссопи1 ротгегЫп1 = д) О перераспределяет и объектов Т, не уни«и«о>сает ик иоЫ Йеп!оса1е (рот!игр, згее 1уре и); // иниупвлизпруеп! 'р зна«еныел! па! оо!Й сопя!гис1(рот1егр, соиМ Тй эа!) ( пеш (р) Т(оа(); ) // уны««по>гает *р, но не перераспределяет опий Йея1гоу (ро1п 1егр) ( р->-Т(); ) Мее 1уре так Мее() сопя1!Ьгот (); // фак!пы«ескп.

1урейе/пуоса1ог<0> оплег 1етр!а1е<с!аия ГТ> Мги с1 геЫпй ( 1урейе/адоса!о с< !!> огЬег; ); 1етр!а1е<с!аяз Т> Ьоо! орега1ог== (сопз1 аИосагог<Т й, сопя! аИоса1ог<7' й) 1Ьгош (); 1етр!а1е<с!аяя Т> Ьоо! орега1огм (сопМайосагог<Т й, сопМ адосагог Т й) !Ьгочы (); 6ЗЗ 19А. Распределители памяти Тпп а11оса1ог<ооЫ>сро!п1ег действует как тип универсального указателя и является ооЫ* для всех стандартных распределителей памяти, Если документация на распределитель памяти не указывает обрагного, у пользователя есть два разумных выбора при вызове а!1оса1е (): Щ 1-1е давать распределителю никакой подсказки. [2) В качестве подсказки использовать указатель на объект, который часто применяется вместе с новым объектом — например, предыдущий элемент в последовательности.

Распределители памяти предназначены для избавления разработчиков контейнеров от необходимости иметь дело напрямую с «сырой» памятью. В качестве примера подумайте, как могла бы использовать память реализация класса оес!ог. 1етр1а1е<с!аяя Т, с1аяяА = о1!оса!ог Т' > с1аяя оесгог( риЫ!с: !урес!е1 1урепатеАсро!пгег!!его!ос; О.. ргшо1е: А а!!ос; Иега1ог о; О распределитель памяти ооьекто ,9 указатель но элел~ента Операция а1!оса1е (л) выделяет память для а объектов, которая может быть снова высвобождена соответствующим вызовом с(еа11оса1е ().

Отметим, что 11еа11оса1е() также принимает в качестве аргумента число и. Это позволяет создавать близкие к оптима.льным распределители, хранящие минимум информации о выделяемой памят!с С другой стороны, такие распределители требуют, чтобы прн вызове с(еа1!оса1е () пользователь всегда указывал правильное и. Отметим: функция !1еа!1оса1е () отличается от оператора с!е1е1е () Я 6.2.6) тем, что указатель, передаваемый ей в качестве аргумента, не может быть равен нулю.

Операция а11оса1ог по умолчанию использует орега1ог пего(я!ее 1) для выделения памяти и с1е!е1е (ооЫ*) для се освобождения. Это приводит к тому, что может быть вызвана пещ Ьапс!1ег (), и в случае, если памяти не хватает, ге!!орируется исключение я111сбас1 аИос. Отметим, что а1!оса!е () не обязана каждый раз вызывать распределитель памяти нижнего уровня, Часто для распределителя памяти лучшей стратегией является поддержка свободного списка областей памяти, готовых к использованию, с минимальными затратами времени (9 19Л.2).

Необязательный аргумент й!п! (подсказка) для а11оса!е () полностъю зависит от реализации. Однако, он предназначен в помощь распределителям памяти для систем, где важна локальность. Например, распределитель может попытаться вьщелить область памяти для связанных между собой объектов в одной и той же странице системы со страничной организацией памяти. Тип аргумента ЬЫ! — указатель из сверхупрощенной специализации: 1етр1а1е<> с1аяя а11осагог<ооЫ> ( рибйс, !урее!е1 оо!с!' роьн1е; 1урес!еТ сопя! оо!Й сопя! ро!п1ег; 1/обротюпе вниминне: не ссьыко 1уреь1е(оои!оа1ие гуре; 1етр!а1е <с1аья !!> я!гис1 геЬ!о<1( гуре<!е1а!!оса1ог Ю>о1!ьег;); 1'!' фиктинески: !уреь!е!' иуосо1ог Ь> о!пег Глава ) 9. Итераторы и распределители памяти 634 риЬИс: ехрпсй пес!ос (я!ее Фуре л, сопя! Тй иа1 = Т (с сопя! АЬ а=А ()) а Нос (а) ( о = аИос аИоса!е (и); !ог (!!ега!игр = о, р<о»л; »»р) аИос сопя!гис! ф, иа!); оо!с! геяегие (я!ее !уре и) ( (Г (п<=сарасйу ()) ге!игл; пега!ог р = а1!ос.ауоса!е (п); Иега1ог у = о; тЫ!е (у<и+яме ()) ( а!1ос.сопение! (р»-», *у); аИос.йея!гоу (д-и.); ) аИосх1еаИоса!е (д, сарае!!у ()); и =р — я!ее(); 0-.

О копирование существующих ялеиентов г7 освобождаеж старое пространство !урес!е!!урепатеА:теЬ!пс!<Е!пуж:огяегЕ!л!с айос; О<шабяон» сж. ч В.ыйб Если А — это а1!оса1ог, то геЫпс1<Е!па»со1йег в определении типа означает а!1оса1ог<Е!и!с», так что предыдугцее определение — это косвенный способ выразить слсдуюгцее: !урес!ез" айова!ог<Е!пу» Е!и!с аИос; Операции типа айоса1огвыражаются в терминах определений типов рош1еги ге!егепсе, чтобы дать пользователю возможность обеспечить альтернативные типы для доступа к памяти. В общем виде сделать это очень трудно.

Например, в рамках языка С++ невозможно определить совершенный ссылочный тип. Однако разработчики реализаций языка и библиотеки могут пользоваться этими определениями типов для поддержки типов, которые не в состоянии ввести рядовой пользователь. Примером может служить распределитель, обеспечиваюшин доступ к долговременной памяти. Другим примером служит тип «длинного» указателя для доступа к главной памяти за пределами того пространства, которое может адресовать указатель по умолчанию (обычно 32<разрядный).

Рядовой пользователь может ввести тип необычного указателя для особых нужд. Этого нельзя сделать для ссылок, но для эксперимента или специализированной системы такое ограничение вполне приемлемо, Распределитель памяти предназначен для того, чтобы было легче работать с объектами типа, определяемого параметром их шаблона, Однако, для болъшинства реализаций контейнеров требуются объекты дополнительных типов. Например, разработчику контейнера Ия! понадобится разместить в памяти объев ты Е!пп.

Обычно память под них должна выделяться распределителями памяти контейнера йя1. Любопытный тип геЫпс! введен для того, чтобы размещать в памяти объекты произвольного типа. Рассмотрим определение: 635 19.4. Распределители памяти Данная косвенность освобождает нас от необходимости упоминать аИоса1ог прямо. Это выражает тип Е!п)г аИос как параметр шаблонаА. Например: 1етр!а1е'с!аяя Т, с1аяяА = айоса1ог«Т >с!аяяйя1( рг!оа1е: с!аяяАий(/" ...'/); //айоса!ог<!.ий> 1урейе~гурепатеАсгетр!а1е геб!пй«1лпк>.:о!бег!лиат айос; ! !пк айос а; // распределитель паяяти для Ипй А айос; //распределитель пачятн для !м1 //- риЫ!с: 1урейе/1урепате А: рот1ег йега1ог; йега1ог !пяегг (йегагог ровд!оп, сон я1 Тй х) ( Тлпб айос: ро!п1егр=а айоса1е (!1 //получение!йп1г 0-.

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

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

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

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