Скотт Мейерс - Эффективный и современный С++. 42 рекомендации по использованию С++11 и С++14

Тут можно читать онлайн Скотт Мейерс - Эффективный и современный С++. 42 рекомендации по использованию С++11 и С++14 - бесплатно полную версию книги (целиком) без сокращений. Жанр: comp-programming, издательство Вильямс, год 2016. Здесь Вы можете читать полную версию (весь текст) онлайн без регистрации и SMS на сайте лучшей интернет библиотеки ЛибКинг или прочесть краткое содержание (суть), предисловие и аннотацию. Так же сможете купить и скачать торрент в электронном формате fb2, найти и слушать аудиокнигу на русском языке или узнать сколько частей в серии и всего страниц в публикации. Читателям доступно смотреть обложку, картинки, описание и отзывы (комментарии) о произведении.
  • Название:
    Эффективный и современный С++. 42 рекомендации по использованию С++11 и С++14
  • Автор:
  • Жанр:
  • Издательство:
    Вильямс
  • Год:
    2016
  • Город:
    Москва
  • ISBN:
    978-5-8459-2000-3
  • Рейтинг:
    3/5. Голосов: 11
  • Избранное:
    Добавить в избранное
  • Отзывы:
  • Ваша оценка:
    • 60
    • 1
    • 2
    • 3
    • 4
    • 5

Скотт Мейерс - Эффективный и современный С++. 42 рекомендации по использованию С++11 и С++14 краткое содержание

Эффективный и современный С++. 42 рекомендации по использованию С++11 и С++14 - описание и краткое содержание, автор Скотт Мейерс, читайте бесплатно онлайн на сайте электронной библиотеки LibKing.Ru
Эффективный и современный С++
В книге рассматриваются следующие темы. Освоение С++11 и С++14 — это больше, чем просто ознакомление с вводимыми этими стандартами возможностями (например, объявлениями типов
, семантикой перемещения, лямбда-выражениями или поддержкой многопоточности). Вопрос в том, как использовать их эффективно, чтобы создаваемые программы были корректны, эффективны и переносимы, а также чтобы их легко можно было сопровождать. Именно этим вопросам и посвящена данная книга, описывающая создание по-настоящему хорошего программного обеспечения с использованием C++11 и С++14 — т.е. с использованием современного С++.
■ Преимущества и недостатки инициализации с помощью фигурных скобок, спецификации
, прямой передачи и функций
интеллектуальных указателей
■ Связь между
,
, rvalue-ссылками и универсальными ссылками
■ Методы написания понятных, корректных,
лямбда-выражений
■ Чем
отличается от
, как они используются и как соотносятся с API параллельных вычислений С++
■ Какие из лучших методов “старого” программирования на С++ (т.е. С++98) должны быть пересмотрены при работе с современным С++
Более чем 20 лет книги
серии
являются критерием уровня книг по программированию на С++. Понятное пояснение сложного технического материала принесло ему всемирную известность. Он всегда самый желанный гость на международных конференциях, а его услуги консультанта широко востребованы во всем мире.
Скотт Мейерс Эффективный и современный С++, После изучения основ С++ я перешел к изучению того, как применять С++ в промышленном программировании, с помощью серии книг Скотта Мейерса Эффективный С++. Эффективный и современный С++ — наиболее важная из книг серии, предлагающая ключевые рекомендации, стили и идиомы, позволяющие эффективно использовать современный С++. Вы еще не купили эту книгу? Сделайте это прямо сейчас. Герб Саттер,
глава Комитета ISO по стандартизации С++, специалист в области архитектуры программного обеспечения на С++ в Microsoft

Эффективный и современный С++. 42 рекомендации по использованию С++11 и С++14 - читать онлайн бесплатно полную версию (весь текст целиком)

Эффективный и современный С++. 42 рекомендации по использованию С++11 и С++14 - читать книгу онлайн бесплатно, автор Скотт Мейерс
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

Однако в вызове emplace_backмы передаем не объект std::regex, а аргументы конструктора объекта std::regex. Это не рассматривается как запрос неявного преобразования. Компилятор трактует этот код так, как если бы вы написали

std::regex r(nullptr); // Компилируется

Если лаконичный комментарий “Компилируется” кажется вам лишенным энтузиазма, то это хорошо, потому что, несмотря на компилируемость, данный код имеет неопределенное поведение. Конструктор std::regex, принимающий указатель const char*, требует, чтобы этот указатель был ненулевым, а nullptr подчеркнуто нарушает данное требование. Если вы напишете и скомпилируете такой код, лучшее, на что вы можете надеяться, — аварийное завершение программы во время выполнения. Если вы не такой счастливчик, то вам предстоит получить немалый опыт работы с отладчиком.

На минутку оставляя без внимания push_backи emplace_back, обратим внимание на то, что очень похожие синтаксисы инициализации дают совершенно разные результаты:

std::regex r1 =nullptr; // Ошибка! Не компилируется

std::regex r2 (nullptr ); // Компилируется

В официальной терминологии стандарта синтаксис, использованный для инициализации r1(со знаком равенства), соответствует инициализации копированием (сору initialization). Синтаксис же, использованный для инициализации r2(с круглыми скобками, хотя могут использоваться и фигурные), дает то, что называется прямой инициализацией (direct initialization). Инициализация копированием не может использовать конструкторы, объявленные как explicit, в то время как прямая инициализация — может. Вот почему строка с инициализацией r1не компилируется, в отличие от строки с инициализацией r2.

Но вернемся к push_backи emplace_backи в более общем случае — к функциям вставки и размещения. Функции размещения используют прямую инициализацию, т.e. могут пользоваться конструкторами, объявленными как explicit. Функции вставки применяют инициализацию копированием, а потому использовать такие конструкторы не могут.

regexes. emplace_back(nullptr); // Компилируется. Прямая

// инициализация разрешает использовать конструктор

// explicit std::regex, получающий указатель

regexes. push_back(nullptr); // Ошибка! Копирующая

// инициализация такие конструкторы не использует

Урок, который следует извлечь из данного материала, состоит в том, что при использовании размещающих функций необходимо быть особенно осторожным и убедиться, что функциям передаются правильные аргументы, поскольку в ходе анализа кода будут рассмотрены даже конструкторы, объявленные как explicit.

Следует запомнить

• В принципе, функции размещения должны иногда быть более эффективными, чем соответствующие функции вставки, и не должны быть менее эффективными.

• На практике они чаще всего более быстрые, когда (1) добавляемое значение конструируется в контейнере, а не присваивается; (2) типы передаваемых аргументов отличаются от типа, хранящегося в контейнере; и (3) контейнер не отвергает дубликаты уже содержащихся в нем значений.

• Функции размещения могут выполнять преобразования типов, отвергаемые функциями вставки.

1

Русский перевод — Александреску Андрей. Современное проектирование на С++ . — М.: Издательский дом “Вильямс”, 2002.

2

Возможен и более гибкий дизайн, который позволяет вызывающим функциям определить, должны ли использоваться круглые или фигурные скобки в функциях, генерируемых из шаблонов. Подробности можно найти в записи от 5 июня 2013 года в Andrzej's С++ blog , “Intuitive interface — Part I”.

3

Синдром запястного канала — неврологическое заболевание, проявляющееся длительной болью и онемением пальцев рук. Широко распространено представление, что длительная ежедневная работа на компьютере, требующая постоянного использования клавиатуры, является фактором риска развития синдрома запястного канала. — Примеч. пер .

4

Применение ключевого слова finalк виртуальной функции препятствует перекрытию этой функции в производном классе. Ключевое слово finalтакже может быть применено к классу; в этом случае класс становится неприменимым в качестве базового.

5

“As if rule” — правило, согласно которому разрешены любые преобразования кода, не изменяющие наблюдаемое поведение программы. — Примеч. ред .

6

Обычно в русскоязычной литературе для термина stack unwinding используется перевод “разворачивание стека”. Однако это не совсем верный перевод. Вот что в переписке с редактором книги пишет по этому поводу профессор университета Иннополис E. Зуев: “ Самый частый вариант перевода — «раскрутка стека» — не просто затемняет существо дела, но просто-таки противоположен ему. При срабатывании исключения начинается процесс поиска в стеке секции (“кадра стека”, stack frame), для которой задан перехват случившегося исключения. В тексте исходной программы такой секции соответствует try-блок с catch-обработчиком, в котором задано имя случившегося исключения. И в процессе этого поиска все секции стека, для которых такой перехват не задан, из стека удаляются. Говорят еще, что производится поиск секции по всей динамической цепочке вызовов. Тем самым стек в целом сокращается, сворачивается. Таким образом, самый адекватный вариант перевода — сворачивание стека ”. Поэтому принято решение переводить stack unwinding как сворачивание стека. — Примеч. ред .

7

Проверка обычно выполняется окольным путем. Функции наподобие std::vector::push_backвызывают шаблон std::move_if_noexcept, вариацию шаблона std::move, который условно выполняет приведение к rvalue (см. раздел 5.1), в зависимости от того, объявлен ли перемещающий конструктор как noexcept. В свою очередь, std::move_if_noexceptконсультируется с std::is_nothrow_move_constructible, а значение этого свойства типа (см. раздел 3.3) устанавливается компиляторами в зависимости от того, объявлен ли перемещающий конструктор как noexcept(или throw()).

8

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

Читать дальше
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать


Скотт Мейерс читать все книги автора по порядку

Скотт Мейерс - все книги автора в одном месте читать по порядку полные версии на сайте онлайн библиотеки LibKing.




Эффективный и современный С++. 42 рекомендации по использованию С++11 и С++14 отзывы


Отзывы читателей о книге Эффективный и современный С++. 42 рекомендации по использованию С++11 и С++14, автор: Скотт Мейерс. Читайте комментарии и мнения людей о произведении.


Понравилась книга? Поделитесь впечатлениями - оставьте Ваш отзыв или расскажите друзьям

Напишите свой комментарий
x