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

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

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

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

Для указателя std : : s h a r ed_pt r разница может оказатьсясущественной, так как копирование std : : shared_pt r требует атомарного инкрементасчетчика ссылок, в то время как перемещение std : : shared_ptr не требует никаких дей­ствий со счетчиком ссылок вообще. Чтобы безопасный с точки зрения исключений коддостиг уровня производительности небезопасного кода, нам надо применить std : : moveк spw для того, чтобы превратить его в rvalue (см. раздел 5. 1 ):/ / Эффективно и безопасноprocessWidget (std: :move (spw) ,computePriority ( ) ) ; / / в смысле исключенийЭто интересный метод, и его стоит знать, но обычно это не имеет особого значения, по­скольку вы будете редко сталкиваться с причинами не использовать mаkе-функцию.

Еслиу вас нет убедительных причин поступать иначе, используйте mаkе-функции.1 54Гпава 4. И н теппектуапьные указателиСледует запомнить•По сравнению с непосредственным использованием new, mаkе-функции устраняютдублирование кода, повышают безопасность кода по отношению к исключениями в случае функций std : : ma ke_shared и std : : al l ocate_shared генерируют мень­ший по размеру и более быстрый код.•Ситуации, когда применение mаkе-функций неприемлемо, включают необходи­мость указания пользовательских удалителей и необходимость передачи инициа­лизаторов в фигурных скобках.•Для указателей std : : shared_pt r дополнительными ситуациями, в которых приме­нение mаkе-функций может быть неблагоразумным, являются классы с пользова­тельским управлением памятью и системы, в которых проблемы с объемом памятинакладываются на использование очень больших объектов и наличие указателейstd : : weak_ptr, время жизни которых существенно превышает время жизни ука­зателей std : : shared_pt r.4 .

5 . П ри испол ьзовании идиомы указателяна реал изацию определяйте спе циал ьныефункции-чл ены в файл е реал изацииЕсли вам приходилось бороться со слишком большим временем построения при­ложения, вы, вероятно, знакомы с идиомой Pimpl (poiпter to implementation, указательна реализацию). Это методика, при которой вы заменяете члены-данные класса указате­лем на класс (или структуру) реализации, помещаете в него члены-данные, использовав­шиеся в основном классе, и обращаетесь к ним опосредованно через указатель.

Предпо­ложим, например, что наш Widget имеет следующий вид:class Widget {puЫic :Widget ( ) ;// В заголовочном файле "widget . h"private :std : : st ring name ;std : : vector<douЫe> da t a ;Gadget gl , g2, gЗ ; / / Gadget-н е кий пользовательский тип};Поскольку члены-данные Widget имеют типы std : : s t r i ng, std : : vector и Gadget,для компиляции Widget должны присутствовать соответствующие заголовочные файлы,а это означает, что клиенты Widget должны включать с помощью директивы # includeзаголовочные файлы s t ring, vect or и gadget .

h. Эти заголовочные файлы увеличи­вают время компиляции клиентов W idget , а также делают этих клиентов зависящи­ми от содержимого указанных заголовочных файлов. Если содержимое заголовочного4.S. При испоnьзовании идиомы указате nя на реаnизацию опредеnяйте специаnьные....1 55файла изменяется, клиенты Widget должны быть перекомпилированы. Стандартные за­головочные файлы string и vector меняются не слишком часто, но заголовочный файлgadget . h вполне может оказаться подвержен частым изменениям.Применение идиомы Pimpl в С++98 могло выполняться с помощью замены членов­данных Widget обычным указателем на объявленную, но не определенную структуру:class Widget {puЫ i c :Widget ( ) ;-Widget ( ) ;1 1 Все еще в заголовочном файле "widget .

h"1 1 Деструктор необходим ( см . ниже )private :struct Impl ; / / Объявление структуры реализацииImpl *pimpl ; / / и указателя на нее};Поскольку W i dget больше не упоминает типы std : : st r i ng, std : : vector и Gadget,клиенты Widget больше не обязаны включать соответствующие заголовочные файлыдля этих типов. Это ускоряет компиляцию, а кроме того, означает, что если что-то в за­головочных файлах будет изменено, это не затронет клиенты W idget.Тип, который был объявлен, но не определен, называется неполным типом.Widget : : Impl является таким неполным типом.

С неполным типом можно сделать оченьнемногое, но в это немногое входит объявление указателя на него. Идиома Pimpl исполь­зует эту возможность.Первая часть идиомы Pimpl - объявление члена-данных, который представляет со­бой указатель на неполный тип. Вторая часть заключается в динамическом созданиии уничтожении объекта, хранящего члены-данные, использующиеся в исходном классе.Соответствующий код находится в файле реализации, например для Widget - в файлеwidget .

срр:# include# i nclude# include#include"widget . h ""gadget . h "<string><vector>1 1 Файл реализации "widget . cpp"s t ruct Widget : : Impl11 Определение Widget : : Implstd : : string name ;1 1 с членами -данными, ранееstd: : vector<douЫe> dat a ; / / находившимися в WidgetGadget gl , g2 , gЗ ;};Widget : : Widget ( ): p!mpl (new Impl )[}1 56/ / Создание членов-данных/ / для данного объекта WidgetГлава 4. И нтеллектуальн ые указателиWidget : : -Widget ( ){ dslete pimpl ; }11 Уничтожение членов -данных11 для данного объектаЗдесь я привожу директивы # include, чтобы было ясно, что общие зависимости от за­головочных файлов для std : : s t r ing, std : : vect o r и Gadget никуда не исчезли и про­должают существовать.

Однако эти зависимости перемещены из файла widget . h (ви­димого и используемого всеми клиентами класса Widget) в файл widget . срр (видимыйи используемый только реализацией Widget). Я также подчеркнул код динамическоговыделения и освобождения объекта Imp l . Необходимость освобождения этого объектапри уничтожении Widget приводит к необходимости деструктора Widget.Но я показал код С++98, от которого пахнет пылью вековой . . . Нет, пылью прошло­го тысячелетия.

Он использует обычные указатели, обычные операторы new и delete,и вообще весь он слишком сырой'. Вся текущая глава построена на идее о том, что ин­теллектуальные указатели куда предпочтительнее обычных указателей, и если мы хо­тим динамически создавать объект W i dge t : : Imp l в конструкторе W i dget и должныуничтожать его вместе с Widget, то для нас отлично подойдет и нтеллектуальный ука­затель std : : un i que_ptr (см. раздел 4.

1 ). Заменяя обычный указатель pimpl указателемstd : : unique_pt r, мы получим следующий код для заголовочного файлаclass Widget {puЫic :Widget ( ) ;11 В файле "widget . h "private :struct Impl ;std: : unique_;> tr<Impl> pimpl ;};/ / Интеллектуальный указатель/ / вместо обычногои для файла реализации:#include# include# include# include"widget . h""gadget . h"<string><vector>struct Widget : : Implstd : : string name ;std : : vector<douЫe> data;Gadget gl, g2 , gЗ;11 В файле "widget . cpp"/ / Как и ранее};Widge t : : Widget ( )11 Согласно разделу 4 .

4: pimpl ( std: : make unique<Impl> O ) 1 1 создаем s td : : unique_ptr_{}51 1 с помощью std : : ma ke_uniqueНепереводимая игра слов, основанная на использовании дпя обычного указателя названия "rawpoiпter" (дословно - "сырой указатель"). - Примеч. пер.4.5. При испоnьзовании идиомы указатеnя на реаnизацию опредеnяйте специаnьные""1 57Вы заметили, что деструктора W i dget больше нет? Дело в том, что нет никакого кода,который требуется в нем разместить. s t d : : unique_pt r автоматически удаляет то, на чтоуказывает, когда он сам (указатель s t d : : unique_ptr ) уничтожается, так что нам не тре­буется ничего удалять вручную. Это одна из привлекательных сторон интеллектуальныхуказателей: они устраняют необходимость утруждать свои руки вводом кода для осво­бождения ресурсов вручную.Этот код компилируется, но, увы, это не самый тривиальный клиент!#include "widget .

h"Widget w;1 1 Ошибка !Получаемое вами сообщение об ошибке зависит от используемого компилятора, но в об­щем случае текст упоминает что-то о применении s i zeof или de lete к неполному типу.Эти операции не входят в число тех, которые можно делать с такими типами.Эта явная неспособность идиомы Pimpl использовать std : : un i que_ptr вызываеттревогу, поскольку ( 1 ) указатели std : : unique_ptr разрекламированы как поддерживаю­щие неполные типы, и (2) идиома Pimpl - один из наиболее распространенных случаевприменения s t d : : unique_ptr.

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

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

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

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