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

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

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

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

2 . Эти п равила предписывают, чтобы для объявления типов, не являющихсяссылочными или типами указатепей (что и выпо1111яется о спучае у), квапификаторы c o n s tи vo l a t i l e были опущены. Следовательно, типом у является просто i n t . Это означает, чтоизбыточные чтения и записи у могут быть удалены. В приведенном примере компиляторыдолжны выпо11нять и инициапизацию, и присваивание у, поскольку х объявлена как vol a t i l e ,так что второе чтение х может давать другое значение, отличное о т первого.7.б. Используйте std::atomic дnя параnnеnьности, volatile-дnя особой памяти277Тот факт, что кажущиеся избыточными загрузки и бессмысленные сохранения долж­ны оставаться на месте при работе с особой памятью, объясняет, кстати, почему для та­кого рода работы не подходят объекты std : : at omic. Компиляторам разрешается устра­нять такие избыточные операции у std : : atomic.

Код написан не в точности так же, каки для volati le, но если мы на минуту отвлечемся от этого и сосредоточимся на том, чтокомпиляторам разрешается делать, то можно сказать, что концептуально компиляторымогут, получив кодstd: : atomic<int> х ;auto у = х ; 1 1 Концептуально чита етух;11 Концептуально читаетх10;11 Записывает хх = 20;11 Записывает х еще разхх( см . ниже )еще раз ( см . ниже )оптимизировать его доauto у =хх;= 20;/ / Концептуально читает11 Записывает хх( см. ниже )Очевидно, что это неприемлемое поведение при работе с особой памятью.Но если х имеет тип s t d : : atomic, ни одна из этих инструкций компилироваться небудет:auto уу = х;х;// Ошибка 1/ / Ошибка !Дело в том, что копирующие операции в s t d : : atomic удалены (см.

раздел 3.5). И незря. Рассмотрим, что произошло бы, если бы инициализация у значением х компилирова­лась. Поскольку х имеет тип s t d : : atomic, тип у был бы также выведен как std : : atomic(см. раздел 1 .2). Ранее я отмечал, что одна из лучших возможностей std : : atomic заклю­чается в атомарности всех их операций, но чтобы копирующее конструирование у из хбыло атомарным, компиляторы должны генерировать код для чтения х и записи у какединую атомарную операцию. В общем случае аппаратное обеспечение не в состоянииэто сделать, так что копирующее конструирование типами std : : atomic не поддержи­вается.

Копирующее присваивание удалено по той же причине, а потому присваива­ние х переменной у также не компилируется. (Перемещающие операции не объявленыв std : : atomic явно, так что в соответствии с правилами генерации специальных функ­ций, описанных в разделе 3. 1 1 , std : : atomi c не предоставляет ни перемещающего кон­струирования, ни перемещающего присваивания.)Можно получить значение х в переменную у, но это требует использования функций­членов load и store типа s t d : : atomic.

Функция-член load атомарно считывает значе­ние std : : atomic, а функция-член store атомарно его записывает. Для инициализации узначением х, после которой выполняется размещение значения х в у, код должен иметьследующий вид:278Глава 7. Параллельные вычисленияstd : : atomic<int> y (x . load ( ) ) ; / / Чтение хy . store (x . load ( ) ) ;/ / Чтение х еще разЭтот код компилируется, но тот факт, что чтение х (с помощью х .

load ( ) ) является от­дельным от инициализации или сохранения значения у вызовом функции, делает оче­видным то, что нет никаких оснований ожидать, что целая инструкция будет выполнять­ся как единая атомарная операция.Компиляторы могут "оптимизировать" приведенный код, сохраняя значение х в реги­стре вместо двойного его чтения:rвgistвr=x .

load ( ) ;/ / Чтение хврегистрstd : : atomic<int> y ( rвgistвr) ; 11 Инициализация у1 1 значением регистрау . store ( rвgistвr) ;/ / Сохранение значения11 регистрав уВ результате, как можно видеть, чтение из х выполняется только один раз, и этой раз­новидности оптимизации следует избегать при работе с особой памятью. (Эта оптимиза­ция не разрешена при работе с переменными vol a t i le.)Таким образом, ситуация должна быть очевидна.•std : : atomic применяется в параллельном программировании, но не для доступак особой памяти.•volat i l e применяется для доступа к особой памяти, но не в параллельном про­граммировании.Поскольку s t d : : atomic и volat i le служат разным целям, они могут использоватьсясовместно:volatile std: : atomic<int> va i ; / / Операции над vai атомарны11 и не могут быть удалены11 при оптимизацииЭтот может оказаться полезным, когда va i соответствует ячейке отображаемого на па­мять ввода-вывода, обращение к которой выполняется несколькими потоками.Последнее примечание: некоторые разработчики предпочитают использовать функ­ции-члены load и store типа std : : atomic даже там, где это не требуется, поскольку эточетко указывает в исходном тексте на то, что данные переменные не являются "обыч­ными': Подчеркивание этого факта не является необоснованным.

Доступ к std: : atomicобычно гораздо медленнее, чем к переменным, не являющимся std : : at omic, и мы ужевидели, что использование s t d : : atomic предотвращает определенное переупорядочениекода, которое иначе было бы разрешено. Вызовы загрузок и сохранений std : : atomic мо­гут тем самым помочь в идентификации потенциальных узких мест масштабируемости.С точки зрения корректности отсутствие вызова store у переменной, предназначеннойдля передачи информации в другие потоки (например, флаг, указывающий доступность7.6.Испопьзуйте std::atomic для параллельности, volatile - для особой памяти279данных), может означать, что эта переменная не объявлена как std : : atomic, хотя долж­на быть таковой.Однако в большей степени это вопрос стиля, и как таковой он не имеет отношенияк выбору между std : : atomic и volat i le.Сл едует запомнить•std : : at omi c применяется для обращения нескольких потоков к данным без исполь­зования мьютексов.

Это инструмент параллельного программирования.•volat i le применяется для памяти, чтения и записи которой не должны удалятьсяпри оптимизации. Это инструмент для работы с особой памятью.280Глава 7. Параллельные вычи слен и яГЛАВА 8Тонко с т иДля каждого общего метода или возможности С++ имеются условия, когда его при­менение является разумным, и обстоятельства, в которых его не следует применять.Обычно описание того, когда имеет смысл применение некоторого общего метода иливозможности, достаточно простое, но в данной главе описываются два исключения изэтого правила: общий метод (передача по значению) и общая возможность (размещение(emplacement)). Решение об их применении зависит от такого большого количества фак­торов, что лучший совет, какой я могу дать, сводится к рассмотрению возможности ихприменения.

Тем не менее оба они являются важными составляющими эффективногосовременного программирования на С++, и приведенная в разделах этой главы инфор­мация необходима для принятия вами решения об их применении в своих программах.8.1 . Рассмотрите передачу по значениюдnя копируемы х параметров, которые ner кoпереме щаются и всеrда копируютсяНекоторые параметры функций предназначаются для копирования'. Например,функция-член addName может копировать свой параметр в закрытый контейнер. Для эф­фективности такая функция должна копировать аргументы, являющиеся lvalue, но пере­мещать аргументы, являющиеся rvalue:class Widget {puЫ ic :void addName ( conвt std : : вtrinq& newName ) / / lvalue ;/ / копируем{ names . push_back ( newName ) ; }// rvalue ;void addName ( s td : : strinq&& newName)/ / перемещаем{ names .

push_back ( std : : move ( newName ) ) ;11 См. применение std : : move в разделе 5 . 31 Вданном разде11е "конирование" параметра в общем с11учае означает его испо11ьзопание как ис­точника дня операций копирования или перемещения. Помните, что в С++ нет терминологиче­ского раз11ичин между копированием, вьшонняемым с помощью операции копирования, и копи­рованием с номощью онсрации неремещенин.private :std : : vector<std: : string> name s ;1;Этот способ работает, но требует двух функций, выполняющих, по сути, одни и те жедействия. Это несколько раздражает: надо объявить две функции, реализовать две функ­ции, документировать две функции и наконец поддерживать также две функции! Тьфу.

. .Кроме того, две функции будут и в объектном коде, что при определенных обстоя­тельствах тоже может напрягать. В данном конкретном случае обе функции, вероятно,будут встраиваемыми, так что этот вопрос не встанет, но если функции не встраиваемые,то в объектном коде будут они обе.Альтернативный подход заключается в том, чтобы сделать addName шаблоном функ­ции, получающей универсальную ссылку (см. раздел 5.2):class Widget {puЫ i c :t:emplate<typename Т>11 Получаем как lvalue,void addName (T&& newName) // так и rvalue ; lvalue11 копируем, rvalue перемещаемnames .

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

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

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

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