Главная » Просмотр файлов » С. Мейерс - Эффективный и современный C++

С. Мейерс - Эффективный и современный C++ (1114942), страница 31

Файл №1114942 С. Мейерс - Эффективный и современный C++ (С. Мейерс - Эффективный и современный C++) 31 страницаС. Мейерс - Эффективный и современный C++ (1114942) страница 312019-05-08СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

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

И нтеллектуальные указатели4.2 . Испопьзуйте s td : : sharedytr дпя управпенияресурсами путем совместноrо впаденияПрограммисты на языках программирования со сборкой мусора показывают паль­цами на программистов на С++ и смеются над ними, потому что те озабочены предот­вращением утечек ресурсов. "Какой примитив! - издеваются они.

- Вы что, застря­ли в 1 960-х годах и в Lisp? Управлять временем жизни ресурсов должны машины, а нелюди': Разработчики на С++ не остаются в долгу: "Вы имеете в виду, что единственнымресурсом является память, а время освобождения ресурса должно быть принципиальнонеопределимо? Спасибо, мы предпочитаем обобщенность и предсказуемость деструкто­ров!" Впрочем, в нашей браваде есть немного бахвальства. Сборка мусора в действитель­ности достаточно удобна, а управление временем жизни вручную действительно можетпоказаться похожим на создание микросхем памяти из шкуры медведя с помощью ка­менных ножей. Почему же не получается взять лучшее из двух миров - систему, котораяработает автоматически (как сборка мусора) и к тому же применима ко всем ресурсами имеет предсказуемое время выполнения (подобно деструкторам)?Интеллектуальный указатель s t d : : shared_pt r представляет собой способ, кото­рым С++ 1 1 объединяет эти два мира.

Объект, доступ к которому осуществляется че­рез указатели std : : sha red_ptr, имеет время жизни, управление которым осущест­вляется этими указателями посредством совместного вла дения. Никакой конкретныйуказатель std : : shared_pt r не владеет данным объектом. Вместо этого все указателиstd : : shared_pt r, указывающие на него, сотрудничают для обеспечения гарантии, чтоего уничтожение произойдет в точке, где он станет более ненужным. Когда последнийуказатель s t d : : shared_pt r, указывающий на объект, прекратит на него указывать (на­пример, из-за того, что этот st d : : shared_pt r будет уничтожен или перенаправленна другой объект), этот std : : shared_pt r уничтожит объект, на который он указывал.Как и в случае сборки мусора, клиентам не надо самим беспокоиться об управлении вре­менем жизни объектов, на которые они указывают, но, как и при работе с деструктора­ми, время уничтожения объекта оказывается строго определенным.Указатель s t d : : shared_ptr может сообщить, является ли он последним указателем,указывающим на ресурс, с помощью счетчика ссылок, значения, связанного с ресурсоми отслеживающего, какое количество указателей std : : shared_pt r указывает на него.Конструкторы std : : shared_pt r увеличивают этот счетчик (обычно увеличивают - см.ниже), деструкторы std : : shared_pt r уменьшают его, а операторы копирующего присва­ивания делают и то, и другое.

(Если spl и sp2 являются указателями std : : shared_ptr,указывающими на разные объекты, присваивание "splsp2 ; " модифицирует spl так,что он указывает на объект, на который указывает sp2. Конечным результатом присва­ивания является то, что счетчик ссылок для объекта, на который изначально указывалspl, уменьшается, а значение счетчика для объекта, на который указывает sp2, увели­чивается.) Если std : : shared_pt r после выполнения декремента видит нулевой счетчикссылок, это означает, что на ресурс не указывает больше ни один std : : shared_pt r, такчто наш интеллектуальный указатель освобождает этот ресурс.=4.2.

Используйте std::sha red_ptr для управления ресурсами путем совместноrо владения1 33Наличие счетчиков ссылок влияет на производительность.•Размер std : : shared_y tr в два раза больше размера обычноrо указателя, по­скольку данный интеллектуальный указатель содержит обычный указатель на ре­сурс и другой обычный указатель на счетчик ссылок2••Память для счетчика ссылок должна выделяться динамически.

Концепту­ально счетчик ссылок связан с объектом, на который он указывает, однако самуказываемый объект об этом счетчике ничего не знает. В нем нет места для хра­нения счетчика ссылок. (Приятным следствием этого является то, что интеллек­туальный указатель s t d : : shared_pt r может работать с объектами любого типа(в том числе встроенных типов).) В разделе 4.4 поясняется, что можно избежатьстоимости динами•1еского выделения при создании указателя std : : shared_pt rс помощью вызова std : : make_shared, однако имеются ситуации, когда функцияs t d : : make _ shared неприменима.

В любом случае счетчик ссылок хранится в ди­намически выделенной памяти.•посколькумогут присутствовать одновременное чтение и запись в разных потоках. Напри­мер, s t d : : shared_ptr, указывающий на ресурс в одном потоке, может выполнятьсвой деструктор (тем самым уменьшая количество ссылок на указываемый им ре­сурс), в то время как в другом потоке указатель std : : shared_ptr на тот же объ­ект может быть скопирован (а следовательно, увеличивает тот же счетчик ссылок).Атомарные операции обычно медленнее неатомарных, так что несмотря на то, чтообычно счетчики ссылок имеют размер в одно слово, следует рассматривать ихчтение и запись как относительно дорогостоящие операции.Инкремент и декремент счетчика ссылок должны быть атомарными,Возбудил ли я ваше любопытство, когда написал, что конструкторы std : : shared_p t r "обычно" увеличивают счетчик ссылок для указываемого объекта? Присозданииstd : : shared_pt r, указывающего на объект, всегда добавляется еще один ин­теллектуальный указатель std : : sha red_ptr, так почему же счетчик ссылок может уве­личиваться не всегда?Из-за перемещающего конструирования - вот почему.

Перемещающее конструиро­вание указателя s t d : : shared_pt r из другого s t d : : shared_pt r делает исходный указа­тель нулевым, а это означает, что старый s t d : : shared_ptr перестает указывать на ре­сурс в тот же момент, в который новый std : : shared_ptr начинает это делать. В резуль­тате изменение значения счетчика ссылок не требуется. Таким образом, перемещениеstd : : sha red_pt r оказывается быстрее копирования: копирование требует увеличениясчетчика ссылок, а перемещение - нет. Это справедливо как для присваивания, таки для конструирования, так что перемещающее конструирование быстрее копирующегоконструирования, а перемещающее присваивание быстрее копирующего присваивания.2 Стандарт не требует испопьзования именно такой реапизации, но все известные мне реапизациистандартной бибпиотеки ноступают именно так.1 34Глава 4.

Интеллектуальные указателиПодобно std : : unique_pt r (см. раздел 4. l ), std : : shared_pt r в качестве механизмаудаления ресурса по умолчанию использует delete, но поддерживает и пользовательскиеудалители. Однако дизайн этой поддержки отличается от дизайна для std : : un i que_ptr.Для s t d : : unique_pt r тип удалителя является частью типа интеллектуального указателя.Для std : : shared_ptr это не так:auto loggingDel=[ ] ( Widget *pw ) / / Пользовательский удалитель/ / ( как в разделе 4 .

1 ){makeLogEntry ( pw ) ;delete pw;1;std: : unique_ytr</ / Тип удалителя являетсяWidget, decltype (logqinqDel) // частью типа указателя> upw ( new Widget, loggingDel ) ;/ / Тип удалителя не являетсяstd: : shared_ytr<Widget>spw ( new Widget , loggingDe l ) ; / / частью типа указателяДизайн std : : shared_pt r более гибок. Рассмотрим два указателя std : : shared_pt r<Widget >, каждый со своим пользовательским удалителем разных типов (например, из-затого, что пользовательские удалители определены с помощью лямбда-выражений):auto customDeleterlauto customDeleter2[][](Widget *pw)( Widget *pw)f ; 1 1 Пользовательскиеf ; 1 1 удалители1 1 разных типовstd : : shared_ptr<Widget> pwl ( new Widget , customDeleterl ) ;std : : shared_ptr<Widget> pw2 ( new Widget , customDeleter2 ) ;Поскольку pwl и pw2 имеют один и тот же тип, они могут быть помещены в контейнеробъектов этого типа:std : : vector<std : : shared_ptr<Widge t>> vpw { pwl , pw2 f ;Они также могут быть присвоены один другому и переданы функции, принимающейпараметр типа s t d : : shared_ptr<Widget>.

Ни одно из этих действий не может быть вы­полнено с указателями std : : uni que_ptr, которые отличаются типами пользовательскихудалителей, так как эти типы влияют на тип самого std : : uni que_ptr.Друтим отличием от s t d : : uni que_pt r является то, что указание пользовательскогоудалителя не влияет на размер объекта s t d : : shared_pt r.

Независимо от удалителя объектstd : : shared_pt r имеет размер, равный размеру двух указателей. Это хорошая новость, ноона должна привести вас в замешательство. Пользовательские удалители могут быть функ­циональными объектами, а функциональные объекты могут содержать любое количестводанных, а значит, быть любого размера. Как же std : : shared_pt r может обращаться к уда­лителю произвольного размера, не используя при этом дополнительной памяти?4.2.Используйте std::shared_ptr дnя управления ресурсами путем совместного впадения1 35А он и не может.

Ему приходится использовать дополнительную память, но эта па­мять не является частью объекта s t d : : sha red_pt r. Она располагается в динамическойпамяти или, если создатель s t d : : shared_pt r воспользуется поддержкой со стороныs t d : : shared_p t r пользовательских распределителей памяти, там, где выделит памятьтакой распределитель.

Ранее я отмечал, что объект std : : shared_ptr содержит указательна счетчик ссылок для объекта, на который он указывает. Это так, но это немного нетак, поскольку счетчик ссылок является частью большей структуры данных, известнойпод названием управляющий блок (control Ыосk). Управляющий блок имеется для каждо­го объекта, управляемого указателями s t d : : shared_ptr. Управляющий блок в дополне­ние к счетчику ссылок содержит копию пользовательского удалителя, если таковой былуказан.

Если указан пользовательский распределитель памяти, управляющий блок содер­жит и его копию. Управляющий блок может также содержать дополнительные данные,включающие, как поясняется в разделе 4.4, вторичный счетчик ссылок, известный какслабый счетчик, но в данном разделе мы его игнорируем. Мы можем представить память,связанную с объектом s t d : : shared_ptr<T>, как имеющую следующий вид:std : : shared ptr<T>Указатеnь на тУправляющий блок объекта настраивается функцией, создающей первый указательstd : : shared_ptr на объект. Как минимум это то, что должно быть сделано.

В общемслучае функция, создающая указатель std : : shared ptr на некоторый объект, не можетзнать, не указывает ли на этот объект некоторый другой указатель s t d : : shared_pt r, такчто при создании управляющего блока должны использоваться следующие правила.•Функция std : : make_shared (см. раздел 4.4) всегда создает управляющий блок.Она производит новый объект, на который будет указывать интеллектуальныйуказатель, так что в момент вызова std : : make_shared управляющий блок для это­го объекта, определенно, не существует.•Управляющий блок создается тогда, когда указатель std : : shared_ptr соз­дается из указателя с исключительным владением (т.е. std : : unique_ptr илиstd : : auto_ptr).

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

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

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

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