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

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

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

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

Такие деструкторы являются редкостью. Их нет в стандартной библи­отеке, и если деструктор объекта, используемого стандартной библиотекой (например,как элемент контейнера или переданный алгоритму аргумент), генерирует исключение,поведение программы является неопределенным.Стоит отметить, что некоторые проектировщики библиотечных интерфейсов разли­чают функции с широкими контрактами от функций с узкими контрактами. Функцияс широким контрактом не имеет предусловий. Такая функция может быть вызвана неза­висимо от состояния программы и не накладывает никаких ограничений на аргументы,передаваемые ей вызывающим кодом".

Функции с широким контрактом никогда не де­монстрируют неопределенного поведения." "Независимо от состояния программы" и "без ограничений" не узаконивает программы, поведениекоторых уже является неопределенным. Например, std : : vector: : size имеет широкий контракт, ноэто не означает, что данная функция донжна разумно себя вести при применении к произвопьномублоку памяти, приведенному к типу std: : vector. Результат приведения не определен, поэтому нетникаких гарантий, касающихся поведения программы, содержащей такое приведение.3.8.

Ес ли функции не генерируют исключений, объяв л яйте их как noexcept1 03Функции без широких контрактов имеют узкие контракты. Если предусловия для та­ких функций нарушены, их результаты являются неопределенными.Если вы пишете функцию с широким контрактом и знаете, что ее не покинут ника­кие исключения, легко следовать совету из данного раздела и объявить ее как noexcept.Для функций с узкими контрактами ситуация сложнее.

Предположим, например, что выпишете функцию f, принимающую параметр s t d : : s t r ing, и пусть естественная реализа­ция f никогда не генерирует исключений. Это предполагает, что функция f должна бытьобъявлена как noexcept.Предположим теперь, что f имеет предусловие: длина ее строкового параме­тра s t d : : s t r i ng не должна превышать 32 символа. Если f вызывается со строкойs t d : : s t r i ng, длина которой больше 32 символов, поведение будет неопределенным,поскольку нарушение предусловия по определению приводит к неопределенному пове­дению. Функция f не обязана проверять это предусловие, так как функции могут счи­тать свои предусловия выполненными. (За обеспечение выполнения таких предположе­ний отвечает вызывающий код.) Тогда даже при наличии предусловия объявление f какnoexcept выглядит целесообразным:void f ( const std : : string& s) noexcept; / / Предусловие :11 s . length ( ) <= 32Но предположим, что разработчик f решил проверять нарушения предусловия.

Такаяпроверка не обязательна, но она и не запрещена; более того, проверка предусловия мо­жет быть полезной, например, в процессе системного тестирования. Отладка сгенериро­ванного исключения в общем случае проще, чем попытки отследить причину неопреде­ленного поведения. Но как следует сообщать о нарушении предусловий, чтобы проверки(или клиентский обработчик ошибок) могли его обнаружить� Простейший подход генерация исключения "предусловие нарушено': но если f объявлена как noexcept, этоможет быть невозможным; генерация исключения приведет к завершению программы.По этой причине разработчики библиотек, различающие широкие и узкие контракты,в общем случае резервируют noexcept для функций с широкими контрактами.В заключение позвольте мне остановиться на моих ранних наблюдениях, что обычнокомпиляторы не предлагают помощи в выявлении несоответствий между реализациямифункций и их спецификациями исключений.

Рассмотрим следующий совершенно кор­ректный код:void setup ( ) ; / / Функции, определенные в другом местеvoid cleanup ( ) ;void doWor k ( ) noexcept11 Настройка для выполнения некоторой работы11 Выполнение работыcleanup ( ) ; 11 Очистка после вьиюлнения работыsetup ( ) ;104Гn ава 3. Переход к современному С++Здесь функция doWor k объявлена как noexcept, несмотря на то, что она вызываетфункции setup и cleanup без такого модификатора. Это кажется противоречием, но ведьможет быть так, что функции setup и cleanup документированы как не генерирующиеисключений, пусть при этом они и не объявлены как noexcept.

Для такого их объявлениямогут иметься некоторые веские причины. Например, они могут быть частью библиотеки,написанной на языке программирования С. (Даже у функций стандартной библиотеки С,перемещенных в пространство имен std, отсутствуют спецификации исключений; напри­мер, std : : st rlen не объявлена как noexcept.) Они также могут быть частью стандартнойбиблиотеки С++98, в которой решено не использовать спецификации исключений С++98и которая еще не пересмотрена на предмет использования возможностей С++ l l .Поскольку для функций, объявленных как noexcept, имеются законные основанияполагаться на код, не имеющий гарантии noexcept, С++ допускает существование такогокода, и компиляторы в общем случае не выдают при этом никаких предупреждений о нем.Следует запомнить•noexcept является частью интерфейса функции, а это означает, что вызывающийкод может зависеть от наличия данного модификатора.•Функции, объявленные как noexcept, предоставляют большие возможности опти­мизации, чем функции без такой спецификации.•Спецификация noexcept имеет особое значение для операций перемещения, обме­на, функций освобождения памяти и деструкторов.•Большинство функций нейтральны по отношению к исключениям, а не являютсяnоехсерt -функциями.3 .

9 . Испол ьзуйте, rде это возмож но, constexprЕсли бы присуждалась награда за наиболее запутанную новую возможность в С++ l l ,без сомнений, ее б ы получило новое ключевое слово con s t expr. При применениик объектам это, по сути, усиленная разновидность const, но при применении к функци­ям оно имеет совсем другой смысл. Имеет смысл разобраться в этой путанице, потомучто, когда ключевое слово constexpr соответствует тому, что вы, хотите выразить, выопределенно, захотите его использовать.Концептуально ключевое слово constexpr указывает значение, которое не просто яв­ляется константой, но и известно во время компиляции.

Эта концепция - лишь частьвсей истории, поскольку при применении const expr к функциям появляется большенюансов, чем можно предположить. Чтобы не забегать вперед и не портить сюрприз,пока что я только скажу, что вы не можете ни считать, что результат соnstехрr-функциипредставляет константу, ни считать, что эти значения известны во время компиляции.Пожалуй, наиболее интригующим является то, что это возможности данного ключевогослова. Это хорошо, что const expr- функция не обязана давать константный результатили результат, известный во время компиляции!3.9. Используйте, rде это возможн о, constexpr105Но давайте начнем с объектов constexpr. Такие объекты являются, по сути, констант­ными ( const ) и на самом деле обладают значениями, известными во время компиляции.(Технически их значения определяются во время трансляции, а трансляция состоит нетолько из компиляции, но и из компоновки.

Однако, если вы не пишете компиляторыили редакторы связей для С++, это не имеет для вас значения, так что можете беспечнопрограммировать так, как будто эти значения объектов constexpr определяются во вре­мя компиляции.)Значения, известные во время компиляции, являются привилегированными.

Они,например, могут быть размещены в памяти, предназначенной только для чтения, и этоможет представлять особое значение для разработчиков встроенных систем. Широкоприменяется то, что целочисленные значения, являющиеся константами и известные вовремя компиляции, могут использоваться в контекстах, где С++ требует целочисленноеконстантное вь1ражение. Такие контексты включают спецификации размеров массивов,целочисленные аргументы шаблонов (включая длину объектов s t d : : a r r a y) , значенияперечислителей, спецификаторы выравнивания и прочее. Если вы хотите использоватьдля этих вещей переменные, вы, определенно, захотите объявить их как constexpr, по­скольку тогда компиляторы будут точно знать, что имеют дело со значением временикомпиляции:/ / Неконстантная переменнаяint s z ;constexpr auto arraySizel=s z ; / / Ошибка ! Значение sz/ / неизвестно при компиляции/ / Ошибка ! Т а ж е проблемаs td : : array<int, sz> data l ;constexpr auto arraySize21 0 ; 1 1 ОК, 1 0 представляет собой11 константу времени компиляции/ / ОК, arraySize2 представляетs td : : array<int,/ / собой constexprarraySize2> data2;Обратите внимание, что const не предоставляет таких же гарантий, что и constexpr,поскольку объекты const не обязаны инициализироваться значениями, известными вовремя компиляции:11int s z ;const auto arrayS i zeК а к и ранее11ОК, arraySi ze являетсяконстантной копией s zstd : : a rray<in t ,1 1 Ошибка ! Значение arraySizearraySi ze> data; 1 1 при компиляции неизвестноsz;11Проще говоря, все объекты, являющиеся constexpr, являются const, но не все объек­ты, являющиеся const, являются constexpr.

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

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

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

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