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

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

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

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

Но давайте подумаем логически. Этот шаблон cbegin принимает3 .7. Предпочитайте итераторы const_iterator итераторам iterator97аргументы любого типа, представляющего контейнерообразную структуру данных С ,и обращается к этому аргументу через ссылку на константный объект contaiпer. ЕслиС - обычный тип контейнера (например, s t d : : vector<iпt> ) , то coпta iпer будет ссыл­кой на сопst-версию этого контейнера (например, coпst std : : vector< i n t > & ) . Вызовфункции beg iп, не являющейся членом (и предоставленной С++ 1 1 ), для константногоконтейнера дает константный итератор coпst_ iterat or, и именно этот итератор и воз­вращает наш шаблон.

Преимущества такой реализации в том, что она работает дажедля контейнеров, которые предоставляют функцию-член beg iп (которую функция С++ l lbegi п, не являющаяся членом, вызывает для контейнеров), но не имеют функции-членаcbegiп. Таким образом, вы можете использовать эту свободную функцию cbegiп с кон­тейнерами, поддерживающими единственную функцию-член beg iп.Этот шаблон работает и в случае, когда С представляет собой встроенный массив.При этом coпta i пer становится ссылкой на константный массив. C++ l l предоставля­ет для массивов специализированную версию функции beg iп, не являющейся членом,которая возвращает указатель на первый элемент массива. Элементы константного мас­сива являются константами, так что указатель, который возвращает свободная функцияbeg i п, возвращает для константного массива указатель на константу, который факти­чески и является coпst_ i terator для массива.

(Для понимания, как специализироватьшаблон для встроенных массивов, обратитесь к обсуждению в разделе l . l вывода типовв шаблонах, которые получают в качестве параметров ссылки на массивы.)Но вернемся к основам. Суть этого раздела заключается в том, чтобы призвать вас ис­пользовать coпst _ i terator везде, где возможно. Фундаментальный мотив для этого применение const всегда, когда это имеет смысл - существовал и до С++ 1 1 , но в С++98этот принцип при работе с итераторами был непрактичным.

В С++ 1 1 это сугубо практи­ческий совет, а в С++ 14 к тому же "доведены до ума" некоторые мелочи, остававшиесянезавершенными в С++ 1 1 .Сл едует зап омнить•Предпочитайте использовать coпst _i terator вместо i terator там, где это можно.•В максимально обобщенном коде предпочтительно использовать версии функцийbegin, end, rbegiп и прочих, не являющиеся членами.3 .8. Есп и функции не rенерируют искпючений,объявпяйте их как noexceptВ С++98 спецификации исключений были довольно темпераментными созданиями.От вас требовалось собрать информацию обо всех типах исключений, которые моглагенерировать функция, так что при изменении реализации функции могла потребоватьизменения и спецификация исключений.

Изменение спецификации исключения моглонарушить клиентский код, так как вызывающий код мог зависеть от исходной специ­фикации исключений. Компиляторы обычно не предлагали никакой помощи в поддер­жании согласованности между реализациями функций, спецификациями исключений98Глава З . Переход к современному С++и клиентским кодом. Большинство программистов в конечном итоге сочло, что специфи­кации исключений в С++98 не стоят затрачиваемых на н их усилий и ими лучше не поль­зоваться вовсе.

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

Вызывающий код может запросить статус noexcept функции, и результатэтого запроса может повлиять на безопасность в смысле исключений или эффективностьвызывающего кода. Таким образом, является ли функция объявленной как noexcept,представляет собой столь же важную часть информации, как и является ли функция-членобъявленной как const. Отсутствие объявления функции как noexcept, когда вы точнознаете, что она не в состоянии генерировать исключения, - не более чем просто плохаяспецификация интерфейса.Но есть и дополнительный стимул для применения noexcept к функциям, которые негенерируют исключений: это позволяет компиляторам генерировать лучший объектныйкод.

Чтобы понять, почему это так, рассмотрим разницу между способами, которымиС++98 и С++ 1 1 сообщают о том, что функция не может генерировать исключения. Пустьимеется функция f, которая обещает вызывающему коду, что тот никогда не получит ис­ключения.

Вот как выглядят два способа это выразить:int f ( int х) throw ( ) ; // f не генерирует исключений : С++98int f ( int х) noexcept; / / f не генерирует исключений : C++ l lЕсли в о время выполнения некоторое исключение покинет f , тем самым будет нару­шена спецификация исключений f. При спецификации исключений С++98 стек вызововсворачивается' до вызывающего f кода, и после некоторых действий, не имеющих зна­чения для данного рассмотрения, выполнение программы прекращается.

При специфи­кации исключений С++ 1 1 поведение времени выполнения несколько иное: стек только,возможно, сворачивается перед завершением выполнения программы.5Обычно в русскоязычной литературе для термина stack ипwiпdiпg используется перевод "разво­рачивание стека". Однако это не совсем верный перевод. Вот что в переписке с редактором книгипишет по этому поводу профессор университета И ннополис Е. Зуев: "Самый частый вариантперевода - «раскрутка стека» - не просто затемняет существо дела, но просто-таки проти­воположен ему.

При срабатывании исключения начинается процесс поиска в стеке секции ("кадрастека", stack fraтe), для которой задан перехват случившегося исключения. В тексте исходнойпрограммы такой секции соответствует trу-блок с саtсh-обработчиком, в котором задано имяслучившегося исключения. И в процессе этого поиска все секции стека, для которых такой пере­хват не задан, из стека удаляются. Говорят еще, что производится поиск секции по всей дина­мической цепочке вь1зовов.

Тем самым стек в целом сокращается, сворачивается. Таким образом,самый адекватный вариант перевода - сворачивание стека': Поэтому принято решение перево­дить stack ипwiпdiпg как сворачивание стека. - Примеч. ред.3.8. Есл и функции не генерируют исключений, обьявляйте их как noexcept99Разница между сворачиванием стека и возможным сворачиванием оказывает на удив­ление большое влияние на генерацию кода.

В случае функции, объявленной как noexcept,оптимизаторам не надо ни поддерживать стек в сворачиваемом состоянии, ни гаранти­ровать, что объекты в такой функции будут уничтожены в порядке, обратном созданию,если вдруг такую функцию покинет исключение. Функции со спецификацией throw ( ) неимеют такой гибкости оптимизации, как и функции без спецификаций вообще. Ситуа­цию можно резюмировать следующим образом:Ret Type fun c t i on (pa rams) noexcept; / / Наиболее оптимизируемаRet Type fun c t i on (params) throw ( ) ;/ / Менее оптимизируемаR e t Type fun c t i on (pa rams ) ;!!Менее оптимизируемаЭтого одного достаточно для того, чтобы объявлять функции, о которых точно из­вестно, что они не генерируют исключений, как noexcept .Для некоторых функций все оказывается еще более интересным.

Выдающимся при­мером являются операции перемещения. Предположим, что у вас имеется код С++98,использующий std : : vector<Widget>. Объекты типа W i dget время от времени добавля­ются в s t d : : vector с помощью функции push_back:s td : : vector<Widget>vw;Widget w;11vw . push_bac k ( w ) ;Работас w/ / Добавлениеw к vwПредположим, что этот код отлично работает, и нет никакой необходимости изме­нять его для С++ 1 1 . Однако вы хотите воспользоваться тем фактом, что семантика пере­мещения С++ 1 1 может улучшить производительность старого кода при участии типов,допускающих перемещающие операции.

Вы уверены, что класс Widget такие операцииимеет - либо потому, что вы написали их самостоятельно, либо потому, что вы убеди­лись в осуществлении условий для их автоматической генерации (см. раздел 3. 1 1 ).Когда в std : : vector добавляется новый элемент, может оказаться, что в std : : vectorдля него не хватает места, т.е. что размер std : : vector равен его емкости. Когда такоеслучается, std : : vector выделяет новый, больший по размеру блок памяти для хране­ния своих элементов и переносит элементы из старого блока в новый.

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

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

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

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