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

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

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

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

Передачу по значению стоит рассматривать только для параметров с недорогим пе­ремещением. Когда перемещение дешевое, стоимость дополнительного перемеще­ния может быть приемлемой, но если это не так, то излишнее перемещение стано­вится аналогичным излишнему копированию, а важность устранения излишнегокопирования и была основной причиной появления правила С++98 о нежелатель­ности применения передачи по значению.4.

Вы должны рассматривать передачу по значению только для параметров, которыевсегда копируются. Чтобы увидеть, почему это важно, предположим, что перед ко­пированием параметра в контейнер names функция addName проверяет, не слиш­ком ли короткое (или длинное) имя передано. Если это так, запрос на добавление286Гла ва В. Тонкостиимени игнорируется. Реализация с передачей по значению может быть написанаследующим образом:class Widget {puЫic :void addName ( st d : : string newName ){if ( (newName .

length () >= minLen) &&(newName . length ( ) <= maxLen) )names . push_back ( s t d : : move (newName) ) ;priva te :std : : vector<std: : string> names ;};Эта функция берет на себя создание и уничтожение newName, даже если в namesничего не добавляется. Это цена, которую подход с передачей по ссылке платитьне должен.Даже когда вы имеете дело с функцией, выполняющей безусловное копирование ко­пируемого типа с дешевым перемещением, бывают моменты, когда передача по значениюможет оказаться неприемлемой.

Это связано с тем, что функция может копировать пара­метр двумя способами: с помощью конструирования (т.е. с помощью копирующего кон­структора или перемещающего конструктора) и с помощью присваивания (т.е. с помощьюоператора копирующего или перемещающего присваивания). Функция addName исполь­зует конструирование: ее параметр newName передается функции vector : : push_back,и внутри этой функции newName конструируется копированием в новом элементе в кон­це вектора std : : vector.

Для функций, которые используют конструирование для ко­пирования своего параметра, анализ, который мы видели ранее, завершен: использова­ние передачи по значению приводит к дополнительному перемещению как для lvаluе­аргументов, так и для rvаluе-аргументов.Когда параметр копируется с использованием присваивания, ситуация становитсяболее сложной. Предположим, например, что у нас есть класс, представляющий пароли.Поскольку пароль может изменяться, мы предоставляем функцию установки changeTo.Используя стратегию передачи по значению, реализовать E'assword можно следующимобразом:class E'assword {puЬl ic:explicit Password ( std: : string pwd) / / Передача: text (std: : move (pwd) ) { }п о значению;/ / конструирование textvoid changeTo (std: : string newPwd)/ / ПередачаВ.1.позначению;Рассмотрите передачу по значению дпя копируемых параметров"..287{ text=std: : move (newPwd) ; 1private :std : : string tex t ;11присваиваниеtext11 Текст пароля1;Хранение паролей в виде обычного текста приведет специалистов по безопасности в не­истовство, но мы их проигнорируем и рассмотрим следующий код:std : : string initPwd ( "Supercal i fragi listicexpialidocious " ) ;Password p ( initPwd ) ;Здесь нет никаких сюрпризов: р .

text конструируется с использованием заданного паро­ля, а применение передачи по значению в конструкторе приводит к стоимости переме­щающего конструирования std : : s t ring, которое может оказаться излишним при при­менении перегрузки или прямой передачи. Все в порядке.Пользователь этой программы может быть не столь оптимистичным насчет пароля,так как слово "Supercalifragilisticexpialidocious" можно найти в словаре.

А потому он пред­принимает действия, которые ведут к выполнению следующего кода:std : : string newPassword = "Beware the Jabberwock" ;p . changeTo (newPassword ) ;Лучше новый пароль старого или нет - вопрос сложный, но это проблемы пользователя.Нашей же проблемой является то, что необходимость функции changeTo использоватьприсваивание (а не конструирование) для копирования параметра newPwd, вероятно,приведет к росту стоимости стратегии передачи параметра по значению.Аргумент, переданный функции changeTo, представляет собой lvalue ( newPassword) ,так что, когда конструируется параметр newPwd, вызывается копирующий конструкторs t d : : s t r i ng. Этот конструктор выделяет память для хранения нового пароля. ЗатемnewPwd присваивается с перемещением переменной t ext, что приводит к освобождениюпамяти, которая ранее принадлежала этой переменной text.

Таким образом, в changeToвыполняются два действия по управлению динамической памятью: одно выделяет па­мять для хранения нового пароля, а второе освобождает память, в которой хранился ста­рый пароль.Но в данном случае старый пароль ("Supercalifragilisticexpialidocious") длиннее нового("Beware the Jabberwock"), так что нет необходимости в выделении и освобождении па­мяти вовсе. Если бы использовался подход с перегрузкой, вероятно, никакие выделенияи освобождения не выполнялись бы:class Pas swordpuЫ i c :void changeTo ( con s t std : : string& newPwd) / / Перегрузка для1 1 lvaluetextnewPwd; / / При text . capacity ( ) >= newPwd .

size ( )1 1 можно использовать память text=288Гла ва 8. Тонкостиprivate :std: : s tring text ;/ / Как вьШJе};В этом сценарии стоимость передачи по значению включает дополнительное выделениеи освобождение памяти - стоимость, которая, скорее всего, превысит стоимость опера­ции по перемещению std : : string на порядки.Интересно, что если старый пароль короче нового, то обычно невозможно избежатьпри присваивании действий по выделению и освобождению памяти, и в этом случае пе­редача по значению будет выполняться практически с той же скоростью, что и передачапо ссылке. Таким образом, стоимость копирования параметров с помощью присваива­ния может зависеть от объектов, участвующих в присваивании! Этот вид анализа при­меним к любому типу параметров, который хранит данные в динамически выделеннойпамяти.

Не все типы таковы, но многие - включая std : : string и s t d : : vectorоб­ладают этим свойством.Это потенциальное увеличение стоимости в общем случае применимо только к пере­даче аргументов, являющихся lvalue, поскольку необходимость выделения и освобожде­ния памяти обычно возникает только тогда, когда выполняется истинное копирование(не перемещение). В случае rvаluе-аргументов перемещений почти всегда достаточно.Получается, что дополнительная стоимость передачи по значению (по сравнениюс передачей по ссылке) для функций, копирующих параметр с использованием присваи­вания, зависит от передаваемого типа, соотношения lvalue- и rvalue-apryмeнтoв и от того,использует ли тип динамическую память (и, если использует, то от реализации операто­ров присваивания для данного типа и вероятности того, что память, связанная с целе­вым объектом присваивания, как минимум того же размера, что и память присваиваемо­го объекта).

В случае std : : str ing она также зависит от того, использует ли реализацияоптимизацию малых строк (SSO; см. раздел 5.7), и если использует, то помещаются липрисваиваемые значения в буфер SSO.Так что, как я говорил, при копировании параметров с помощью присваивания ана­лиз стоимости передачи по значению становится весьма сложным. Обычно наиболеепрактичный подход состоит в стратегии презумпции виновности ("виновен, пока не до­казано иное"), в соответствии с которым вы используете перегрузку или универсальнуюссылку, а не передачу по значению, пока не будет показано, что передача по значениюдает приемлемо эффективный код для используемого вами типа параметра.Итак, для программного обеспечения, которое должно быть насколько это возможнобыстрым, передача по значению может оказаться неподходящей стратегией, посколькуважным может быть даже устранение дешевых перемещений.

Кроме того, не всегда по­нятно, сколько же перемещений имеют место на самом деле. В примере Widget : : addNameпередача по значению приводит только к одной лишней операции перемещения; однакопредположим, что W i dget : : addName вызывает Widget : : va l idateName, в которую пара­метр также передается по значению. (Возможно, имеется причина для того, чтобы всегда-8 . 1 . Рассмотрите передачу по значению дпя копируемых параметров"..289копировать параметр, например, для хранения его в структуре данных всех проверенныхзначений.) Предположим также, что функция val idateName вызывает третью функциюс передачей ей параметра по значению . . .Как видите, название раздела не зря такое неопределенное. Когда имеется цепочкавызовов функций, каждая из которых использует передачу по значению, поскольку "егостоимость составляет только одно недорогое перемещение': стоимость всей цепочки мо­жет стать такой, что вы не сможете спокойно ее терпеть.

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

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

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

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