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

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

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

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

если бы значенияв структуре Impl могли совместно использоваться несколькими W idget ) , то нашли бы,что советы из данного раздела больше не применимы. Нам бы не потребовалось объяв­лять деструктор в Widget, а без пользовательского деструктора компиляторы с удоволь­ствием генерировали бы операции перемещения, которые делали бы именно то, чтоот них требуется. То есть при следующем коде в файле widget . hclass Widget {// В файле "widget . h"puЫic :Widget ( ) ;// Нет объявлений деструктора// и перемещающих операцийprivate :struct Impl;};std: : shared_J>tr<Impl> pimpl; // std: : shared_ptr// вместо std : : unique_ptrи приведенном далее коде клиента, который включает заголовочный файл widget .

hWidget wl ;auto w2 ( std : :move (wl ) ) ; 11 Перемещающее конструирование w211 Перемещающее присваивание wlwl = std: :move (w2 ) ;все компилировалось бы и работало именно так, как мы рассчитывали: wl был бы созданконструктором по умолчанию, его значение было бы перемещено в w2, а затем это значе­ние, в свою очередь, было бы перемещено в wl, после чего и wl, и w2 были бы уничтоже­ны (тем самым приводя к уничтожению объекта Widget : : Impl ) .Различие в поведении указателей s td : : unique _pt r и std : : shared_pt r для pimplвытекает из различий путей, которыми эти интеллектуальные указатели поддерживают1 62Глава 4.

Интеллектуальные указателипользовательские удалители. Для std : : unique_pt r тип удалителя является частью типаинтеллектуального указателя, и это позволяет компилятору генерировать меньшиеструктуры данных времени выполнения и более быстрый код. Следствием этой болеевысокой эффективности является то, что указываемые типы должны быть полными, ког­да используются специальные функции-члены, генерируемые компиляторами (например,деструкторы или перемещающие операции).

В случае s t d : : shared_pt r тип удалителя неявляется частью типа интеллектуального указателя. Это требует больших структур дан­ных времени выполнения и несколько более медленного кода, но зато указываемые типыне обязаны быть полными при применении специальных функций-членов, генерируемыхкомпиляторами.При применении идиомы Pimpl в действительности нет никакого компромисса междухарактеристиками s t d : : un i que_p t r и std : : shared_pt r, поскольку отношения междуклассами наподобие W idget и Widget : : Impl представляют собой исключительное владе­ние, и это делает единственно верным выбором в качестве инструмента интеллектуаль­ный указатель std : : unique_pt r.

Тем не менее стоит знать, что в других ситуациях - си­туациях, в которых осуществляется совместное владение (а следовательно, правильнымвыбором является std : : shared_pt r},нет необходимости прыгать через горящие об­ручи определений функций, которую влечет за собой применение std : : unique_pt r.-Сnедует запомнить•Идиома Pimpl уменьшает время построения приложения, снижая зависимостикомпиляции между клиентами и реализациями классов.•Для указателей plmpl типа s t d : : unique_pt r следует объявлять специальные функ­ции-члены в заголовочном файле, но реализовывать их в файле реализации.

Посту­пайте так, даже если реализации функций по умолчанию являются приемлемыми.•Приведенный выше совет применим к интеллектуальному указателю std : : unique_pt r, но не к std : : shared_pt r.4.5. При использовании идиомы указателя на реализацию определяйте специальные" "1 63ГЛАВА SRvalue - cc ы n к и , с емант и кап ереме щ ен и и и п р ямая п ередачаvНа первый взгляд, семантика перемещения и прямой передачи кажется довольнопростой.•Семантика перемещения•Прямая передачапозволяет компиляторам заменять дорогостоящие опера­ции копирования менее дорогими перемещениями.

Так же, как копирующие кон­структоры и копирующие операторы присваивания дают вам контроль над тем, чтоозначает копирование объектов, так и перемещающие конструкторы и перемеща­ющие операторы присваивания предоставляют контроль над семантикой переме­щения.

Семантика перемещения позволяет также создавать типы, которые могуттолько перемещаться, такие как std : : unique_pt r, std : : future или s t d : : thread.делает возможным написание шаблонов функций, которые при­нимают произвольные аргументы и передают их другим функциям так, что целевыефункции получают в точности те же аргументы, что и переданные исходным функ­циям.Rvаluе-ссылки представляют собой тот клей, который соединяет две эти довольноразные возможности.

Это базовый механизм языка программирования, который делаетвозможными как семантику перемещения, так и прямую передачу.С ростом опыта работы с этими возможностями вы все больше понимаете, что вашепервоначальное впечатление было основано только на пресловутой вершине айсберга.Мир семантики перемещения, прямой передачи и rvalue-ccылoк имеет больше нюансов,чем кажется на первый взгляд. Например, std : : move ничего не перемещает, а прямаяпередача оказывается не совсем прямой.

Перемещающие операции не всеrда дешевле ко­пирования, а когда и дешевле, то не всегда настолько, как вы думаете; кроме того, онине всегда вызываются в контексте, где перемещение является корректным. Конструкцияtype & & не всегда представляет rvalue-ccылкy.Независимо от того, как глубоко вы закопались в эти возможности, может показать­ся, что можно долго копать еще глубже. К счастью, эта глубина не безгранична. Эта главадоведет вас до коренной породы. Когда вы докопаетесь до нее, эта часть С++ 1 1 будетвыглядеть намного более осмысленной. Например, вы познакомитесь с соглашения­ми по использованию s t d : : move и std : : forward. Вы почувствуете себя намного болеекомфортно, сталкиваясь с неоднозначной природой t ype & & .

Вы поймете причины уди­вительно разнообразного поведения перемещающих операций. Все фрагменты мозаикивстанут на свои места. В этот момент вы окажетесь там, откуда начинали, потому чтосемантика перемещений, прямая передача и rvаluе-ссылки вновь покажутся вам доста­точно простыми. Но на этот раз они будут оставаться для вас такими навсегда.В этой главе особенно важно всегда иметь в виду, что параметр всегда является lvalue,даже если ero тип - rvalue-ccылкa. Иными словами, в фрагментеvoid f (Wiclget&& w ) ;параметр w представляет собой lvalue, несмотря на то что его тип - rvalue-ccылкaна Widget. (Если это вас удивляет, вернитесь к обзору lvalue и rvalue, который содержит­ся во введении.)S.1 .

Азы s td : : move и s td : : forwardПолезно подойти к s t d : : move и std : : forward с точки зрения того, чего они не дела­ют. std : : move ничего не перемещает. std : : forward ничего не передает. Во время вы­полнения они не делают вообще ничего.

Они не генерируют выполнимый код - ни од­ного байта.std : : move и std : : forward являются всего лишь функциями (на самом деле - шаб­лонами функций), которые выполняют приведения. std : : move выполняет безусловноеприведение своего аргумента к rvalue, в то время как std : : forward выполняет приведе­ние только при соблюдении определенных условий.

Это все. Пояснения приводят к ново­му множеству вопросов, но, по сути, история на этом завершена.Чтобы сделать историю более конкретной, рассмотрим пример реализации std : : moveв С++ 1 1 . Она не полностью соответствует деталям стандарта, но очень близка к этому.template<typename Т>11 В пространстве имен stdtypename remove_reference<T> : : type & &m.ove ( T & & param){us ing ReturnType = 11 Объявление псевдонима ; см.

раздел 3 . 3typename remove_reference<T> : : type & & ;return static_cast<Return'l'ype> (param) ;Я выделил здесь две части кода. Одна - имя функции, потому что спецификация воз­вращаемого типа достаточно запутанна, и я бы не хотел, чтобы вы в ней заблудились.Вторая - приведение, которое составляет сущность функции. Как вы можете видеть,std : : move получает ссылку на объект (чтобы быть точным - универсальную ссылку;см. раздел 5.2) и возвращает ссылку на тот же объект.Часть & & возвращаемого типа функции предполагает, что s t d : : move возвращаетrvalue-ccылкy, но, как поясняется в разделе 5.6, если тип т является \vаluе-ссылкой, Т & &1 66Глава S. Rvаluе-ссылки, семантика перемещений и прямая передачастановится \vа\uе-ссылкой.

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

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

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

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