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

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

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

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

Она не просто позволяет компиляторам заменять дорогостоящие опера­ции копирования относительно дешевыми перемещениями, но и требует от них этого(при выполнении надлежащих условий). Возьмите ваш код С++98, перекомпилируйте егос помощью компилятора и стандартной библиотеки С++ 1 1 и - о чудо! - ваша програм­ма заработает быстрее.Семантика перемещения действительно в состоянии осуществить все это - и потомудостойна легенды. Однако легенды, как правило, - это результат преувеличения. Цельданного раздела - спустить вас с небес на землю.Начнем с наблюдения, что многие типы не поддерживают семантику перемещения.Вся стандартная библиотека С++98 была переработана с целью добавления операцийперемещения для типов, в которых перемещение могло быть реализовано быстрее копи­рования, и реализации компонентов библиотеки были пересмотрены с целью использо­вания преимуществ новых операций; однако есть вероятность, что вы работаете с кодом,который не был полностью переделан под C++ l l .

Для типов в ваших приложениях (илив используемых вами библиотеках), в которые не были внесены изменения для С++ 1 1 ,мало пользы от наличия поддержки перемещения компилятором. Да, С++ 1 1 готов ге­нерировать перемещающие операции для классов, в которых они отсутствуют, но этопроисходит только для классов, в которых не объявлены копирующие операции, пере­мещающие операции или деструкторы (см. раздел 3. 1 1 ). Члены-данные базовых классовтипов, в которых перемещения отключены (например, путем удаления перемещающихопераций; см.

раздел 3.5) также подавляют перемещающие операции, генерируемые208Глава 5. Rvаluе-ссылки, семантика перемещений и прямая передачакомпиляторами. Для типов без явной поддержки перемещения и типов, которые не могутпретендовать на перемещающие операции, генерируемые компилятором, нет основанийожидать что С++ 1 1 обеспечит повышение производительности по сравнению с С++98.Даже типы с явной поддержкой перемещений не могут обеспечить все, на что вы на­деетесь.

Например, все контейнеры стандартной библиотеки С++ 1 1 поддерживают пере­мещение, но было бы ошибкой считать, что перемещение является дешевой операциейдля всех контейнеров. Для одних контейнеров это связано с тем, что нет никакого дей­ствительно дешевого способа перемещения их содержимого. Для других - с тем, чтодействительно дешевые перемещающие операции предлагаются контейнерами с оговор­ками, которым не удовлетворяют конкретные элементы контейнера.Рассмотрим новый контейнер C++ l l - s t d : : a r r a y . Контейнер s t d : : a r r a y,по сути, представляет собой встроенный массив с SТL-интерфейсом.

Он фундамен­тально отличается от других стандартных контейнеров, которые хранят свое содержи­мое в динамической памяти. Объекты таких типов контейнеров концептуально содер­жат (в качестве членов-данных) только указатель на динамическую память, хранящуюсодержимое контейнера. (Действительность более сложна, но для наших целей эти от­личия не играют роли.) Наличие такого указателя позволяет перемещать содержимоевсего контейнера на константное время: просто копируя указатель на содержимое кон­тейнера из исходного контейнера в целевой и делая указатель исходного контейнеранулевым:std: : vector<Widget> vw l ;// Размещение данных в vwlvwlWidgetsvwl/ / Перемещение vwl в vw2 .

ВЬПlолняется11 за константное время, изменяя// только указатели в vwl и vw2auto vw2std : : move (vwl ) ;WidgetslnиllJ=Объекты std : : array не содержат такого указателя, поскольку данные, содержащиесяв std : : array, хранятся непосредственно в объекте std : : a rray:std: : array<Widge t , 1 0000> awl ;11 Размещение данных в vwl1awl'Widgets��Ф 4J4ФZ!&!QZLCJtЮИ Ц щ$1.Цawl// Перемещение vwl в vw2 . ВЬПlолняется// за линейное время . Все элементы11 awl перемещаются в aw2auto aw2std: : move (awl ) ;=Widgets (перемещение отсюда)·aw2Widgets ((перемещение сюда)Обратите внимание, что все элементы из awl перемещаются в aw2.

В предположе­нии, что W idget представляет собой тип, операция перемещения которого выполняетсябыстрее операции копирования, перемещение std : : array элементов Widget будет более5.7.Считайте, что перемеща ющие операции отсутствуют, дороrи ипи не используются209быстрым, чем копирование того же std : : array. Поэтому std : : a rray предлагает под­держку перемещения. И копирование, и перемещение std : : a rray имеют линейное времяработы, поскольку должен быть скопирован или перемещен каждый элемент контейнера.Это весьма далеко от утверждения "перемещение контейнеров теперь такое же дешевое,как и копирование указателей", которое иногда приходится слышать.С другой стороны, std : : s t r i ng предлагает перемещение за константное время и ко­пирование - за линейное. Создается впечатление, что в этом случае перемещение бы­стрее копирования, но это может и не быть так. Многие реализации строк используютоптимизацию малых строк (small string optimization - SSO).

При использовании SSO"малые" строки (например, размером не более 1 5 символов) хранятся в буфере в самомобъекте s t d : : s t r i ng; выделение динамической памяти не используется. Перемещениемалых строк при использовании реализации на основе SSO не быстрее копирования, по­скольку трюк с копированием только указателя на данные, который в общем случае обе­спечивает повышение эффективности, в данном случае не применим.Мотивацией применения SSO является статистика, указывающая, что короткие стро­ки являются нормой для многих приложений. С помощью внутреннего буфера для хра­нения содержимого таких строк устраняется необходимость динамического выделенияпамяти для них, и это, как правило, дает выигрыш в эффективности. Следствием этоговыигрыша является то, что перемещение оказывается не быстрее копирования" .

Хотядля любителей наполовину полного стакана·' можно сказать, что для таких строк копиро­вание не медленнее, чем перемещение.Даже для типов, поддерживающих быстрые операции перемещения, некоторые ка­жущиеся очевидными ситуации могут завершиться созданием копий. В разделе 3.8 по­ясняется, что некоторые контейнерные операции в стандартной библиотеке предпола­гают строгие гарантии безопасности исключений и что для гарантии того, что старыйкод С++98, зависящий от этой гарантии, не станет неработоспособным при переходена С++ 1 1 , операции копирования могут быть заменены операциями перемещения, толь­ко если известно, что последние не генерируют исключений. В результате, даже если типпредоставляет перемещающие операции, более эффективные по сравнению с соответ­ствующими копирующими операциями, и даже если в определенной точке кода пере­мещающая операция целесообразна (например, исходный объект представляет собойrvalue), компиляторы могут быть вынуждены по-прежнему вызывать копирующие опе­рации, поскольку соответствующая перемещающая операция не объявлена как noexcept.Таким образом, имеется ряд сценариев, в которых семантика перемещения С++ 1 1 не­пригодна.•Отсутствие перемещающих операций.

Объект, из которого выполняется переме­щение, не предоставляет перемещающих операций. Запрос на перемещение, такимобразом, превращается в запрос на копирование.•Перемещение не быстрее. Объект, из которого выполняется перемещение, имеетперемещающие операции, которые не быстрее копирующих.' Известная история о том, что об одном и том же до сре11ины напол11е1111ом стакане пессимистыговорят, что он наполовину пуст, а оптимисты - что он наполовину полон. - Примеч. пер.210Глава S. Rvаluе-ссы л ки, семантика перемещений и прямая передача•Контекст, в котором должно иметь место перемеще­ние, требует операцию, не генерирующую исключения, но операция перемещенияне объявлена как noexcept.Перемещение неприменимо.Стоит упомянуть также еще один сценарий, когда семантика перемещения не приво­дит к повышению эффективности.•Исходный объект является lvalue.

За очень малыми исключениями (см., например,раздел 5.3) только rvalue могут использоваться в качестве источника перемещающейоперации.Но название этого раздела предполагает отсутствие перемещающих операций, ихдороговизну или невозможность использования. Это типично для обобщенного кода,например, при написании шаблонов, поскольку вы не знаете всех типов, с которымипридется работать.

В таких условиях вы должны быть настолько консервативными в от­ношении копирования объектов, как будто вы работаете с С++98, - до появления се­мантики перемещения. Это также случай "нестабильного" кода, т.е. кода, в котором ха­рактеристики используемых типов относительно часто изменяются.Однако зачастую вам известно, какие типы использует ваш код, и вы можете по­ложиться на неизменность их характеристик (например, на поддержку ими недорогихперемещающих операций). В этом случае вам не надо делать такие грустные предполо­жения. Вы просто изучаете детали поддержки операций перемещения, используемых ва­шими типами. Если эти типы предоставляют недорогие операции перемещения и есливы используете объекты в контекстах, в которых эти операции будут вызываться, можетебезопасно положиться на семантику перемещений при замене копирующих операций ихменее дорогими перемещающими аналогами.Сnедует запомнить•Считайте, что перемещающие операции отсутствуют, дороги или не используются.•В коде с известными типами или поддержкой семантики перемещения нет необходи­мости в таких предположениях.5 .8.

Познакомьтесь с сnучаями некорректно йработы прямой передачиОдной из ярких звезд на небосклоне С++ 1 1 является прямая передача (perfectforwarding). Можно сказать, идеально прямая. Но, как говорит наука, даже пространствоискривляется, так что есть идеальная прямота, а есть реальная. Прямая передача С++ 1 1очень хороша, но достигает истинного совершенства, только если вы готовы игнориро­вать небольшие искривления. В данном разделе вы познакомитесь с этими маленькимиискривлениями.Перед тем как перейти к их изучению, стоит посмотреть, что мы подразумеваемпод "прямой передачей". Под передачей подразумевается, что одна функция передает5 .8.П ознакомьтесь с сnучаями некорректной работы прямой передачи21 1своим параметры другой функции.

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

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

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

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