Dyzzet|
C++ Data Science Алгоритмы Темы · Блог · YouTube
Обзоры книг по C++
Профессиональная литература. Часть I

Андрей Александреску. Современное проектирование на C++. Обобщённое программирование и прикладные шаблоны проектирования

336 страниц. Вильямс, 2002

Andrei Alexandrescu. Modern C++ Design: Generic Programming and Design Patterns. Addison-Wesley, 2001

Андрей Александреску — соавтор языка D.

Э. Гамма, Р. Хелм, Р. Джонсон, Д. Влиссидес. Приёмы объектно-ориентированного проектирования, оригинал 1995 года

Книгу открывают предисловия Скотта Мейерса и Джона Влиссидеса (соавтора знаменитой книги о шаблонах проектирования от «банды четырёх»).

Материал, безусловно, сложный. Это то, что называют шаблонной магией. Автор показывает устройство реальной библиотеки Loki. Хотя всё подробно описывается, читатель должен уже быть хорошо подготовлен.

К сожалению, в русском переводе есть опечатки в коде и ошибки в терминах: copy constructor, то есть конструктор копирования, в одном месте перевели непонятно как; некоторые термины на момент перевода ещё не устоялись в русском языке, так, frameworks перевели как специальные среды разработки (но в скобках даётся оригинал, так что можно понять).

Содержание первой части: стратегии, приёмы программирования, списки типов, размещение в памяти небольших объектов. Содержание второй части: обобщённые функторы, шаблон синглетон, умные указатели, фабрики объектов, абстрактные фабрики, шаблон «Посетитель», мультиметоды.

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

Приложение: многопоточная библиотека в стиле минимализма.

Герб Саттер, Андрей Александреску. Стандарты программирования на C++. 101 правило и рекомендация

224 страницы. Вильямс, 2005

Herb Sutter, Andrei Alexandrescu. C++ Coding Standards. 101 Rules, Guidelines, and Best Practices. Addison-Wesley, 2005

Авторы в советах (почти всегда) следуют шаблону: краткое содержание, мотивировка, примеры, исключения, ссылки на литературу.

Книга написана одновременно строгим и человеческим языком, порой с юмором:

«Первое правило оптимизации: не оптимизируйте. Второе правило оптимизации (только для экспертов): не оптимизируйте ни в коем случае».

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

«„Не возвращайте указатель или ссылку на локальную переменную“ — хороший совет, но он не включён в данную книгу, поскольку практически все компиляторы выдают соответствующее предупреждение...»

Здесь за двадцать лет тоже что-то устарело, например, совет о том, что не нужно без лишней необходимости пользоваться спецификацией исключений.

Дэвид Вандевурд, Николаи М. Джосаттис, Дуглас Грегор. Шаблоны C++. Справочник разработчика

848 страниц. Альфа-книга, 2018

David Vandevoorde, Nocolai M. Josuttis, Doglas Gregor. C++ Templates. The Complete Guide. Addison-Wesley, 2018

Николаи М. Джосаттис. Стандартная библиотека C++. Справочное руководство

Quora: David Vandevoorde

Первое издание (это уже второе) вышло в 2002 году. Первые два соавтора — участники комитета по стандартизации языка. Дэвид Вандевурд регулярно отвечает на вопросы на сайте Quora.

В книге три части: основы (шаблоны функций, классов, вариативные шаблоны, семантика перемещения и std::enable_if, perfect forwarding...), детали (инстанцирование, вывод аргументов, специализация и перегрузка...) и шаблоны проектирования (полиморфизм, свойства типов, наследование, кортежи, контролируемые объединения, шаблоны выражений, отладка шаблонов...).

Большая и очень сложная книга. Содержит всё — от основ до тонкостей современных стандартов. Описывает и то, почему какие-то вещи невозможны, например, template <char const* msg>.

Приложения: правило одного определения, категории значений, разрешение перегрузки, стандартные утилиты для работы с типами, концепты.

Курт Гантерот. Оптимизация программ на C++. Проверенные методы для повышения производительности

400 страниц. Альфа-книга, 2017

Kurt Guntheroth. Optimized C++. Proven Techniques for Heightened Performance. O’Reilly, 2016

«Приветствую вас! Меня зовут Курт, и я кодоголик».

Содержание: обзор, оптимизация, влияющая на поведение компьютера, измерение производительности, оптимизация строк, алгоритмов, переменных в динамической памяти, инструкций, использование лучших библиотек, оптимизация сортировки и поиска, структур данных, ввода-вывода, параллельности, управления памятью (аллокаторы).

Подход обстоятельный. В начале книги описывается закон Амдала — улучшение времени выполнения \(S_T\):

\(S_T = \dfrac{1}{(1-P)+\frac{P}{S_p}}\),

где \(P\) — доля оптимизированного общего времени выполнения, \(S_p\) — показатель улучшения в оптимизированной части \(P\). Например, если некоторая функция выполнялась 80 процентов всего времени работы программы, а улучшенная её версия стала работать на 30 процентов быстрее, иначе говоря, \(P=0{,}8\), \(S_p=1{,}3\), то \(S_T\approx 1{,}22\).

Глава «Оптимизация, влияющая на поведение компьютера» — очерк того, с какими абстракциями аппаратного и программного обеспечения приходится иметь дело. Большая часть тем — это последовательное улучшение некоторого базового примера.

Стефан К. Дьюхэрст. Скользкие места C++. Как избежать проблем при проектировании и компиляции ваших программ

264 страницы. ДМК, 2006

Stephen C. Dewhurst. C++ Gotchas. Avoiding Common Problems in Coding and Design. Addison-Wesley, 2003

99 советов, сгруппированных по темам. Содержание: основы, синтаксис, препроцессор, преобразования, инициализация, управление памятью и ресурсами, полиморфизм, проектирование классов, проектирование иерархий.

Все плохие примеры кода написаны на сером фоне, хорошие — на белом (по большей части).

Примерно половина книги — довольно простые, но хитрые примеры.

h.*value = 1.85
*(double *)((char *)&h+(value-1)) = 1.85

Стивен С. Дьюхерст. C++. Священные знания

240 страниц. Символ-Плюс, 2007

Stephen C. Dewhurst. C++ Common Knowledge. Addison-Wesley, 2005

Оригинальное название — отсылка к колонке Стивена Дьюхерста Common Knowledge в журнале C++ Report (главредом был Герб Саттер).

Из отзыва Стенли Липпмана мы узнаём: «Стив научил меня C++. Это было в далёком 1982 или 1983. Я думаю, он тогда только вернулся с последипломной практики, которую проходил вместе с Бьерном Страуструпом в научно-исследовательском центре Bell Laboratories. Стив — один из невоспетых героев, стоящих у истоков».

63 темы без группировки. Это и «старые» вещи вроде указателей на указатели, а также тонкости реализации ООП в C++, шаблоны, STL, некоторые шаблоны проектирования.

Евгений Александрович Зуев, Анатолий Анатольевич Чупринов. Стандарт C++: перевод, комментарии, примеры

888 страниц. Ваш формат, 2016

Working Draft, Standard for Programming Language C++ — оригинальный текст черновика стандарта (22 мая 2015)

Блог «Алёна C++»: «Евгений Зуев просит помочь с комментариями к переводу нового стандарта С++» (2009)

Слайды от автора, где он объясняет, зачем нужен свой компилятор (так решила компания)

Автор вёл блоги zouev.blogspot.com и sites.google.com/site/zouev54

Есть книга и статья того же автора «Редкая профессия» в журнале PC Magazine — о создателях компиляторов

Обсуждение на RSDN

Это перевод части стандарта C++17: главы 1—16 (ядро) и 17—18 (вводные главы о библиотеке). Приложения: сводка синтаксических правил (перевод приложения Grammar Summary), глоссарий. Интересно, получали ли авторы разрешение на перевод.

Первый автор — разработчик компиляторов в компании, указанной на обложке. Соавтор на тот момент числился гендиректором. Идея перевести стандарт пришлась на 2006 год. В 2009 году в блогосфере были просьбы помочь с переводом. На исполнение ушло десять лет.

Перевод некоторых терминов немного запутанный, например, compiler’s front-end — компилятор переднего плана, one definition rule — правило одного описания (а не определения) и т. д.

«Флагманский продукт компании — компилятор переднего плана языка C++. Заметим, что это полностью отечественная разработка, в которой нет ни единой строки, взятой из каких-либо других софтверных проектов. Компилятор защищён свидетельством (Роспатентом) №2001610833 от 4 июля 2001 г. За последние годы мы успешно портировали его на несколько моделей отечественных микропроцессоров».

Перевод содержит комментарии. Или, я бы даже сказал, комменты. Автору перевода ничего не стоит назвать какую-то формулировку из стандарта «невразумительным пассажем».

1.4 Соответствие реализации настоящему Стандарту

Implementation compliance

Набор правил, диагностируемых реализацией (diagnosable rules), состоит из всех синтаксических и семантических правил настоящего Международного Стандарта, за исключением правил, содержащих явную оговорку «в случае нарушения правила диагностика не требуется», либо описанных как вызывающие (в случае их нарушения) «неопределённое поведение программы».

Комментарий. Если вдуматься, то это весьма удивительное допущение «данного Международного Стандарта»: оказывается, некоторые ошибки в программах можно не диагностировать (в книге этот фрагмент подчёркнут — Прим. DZ.)! Любой программист, не знакомый с историей возникновения C++, может воскликнуть: да что же это за язык такой, что реализация не в состоянии выявить ошибку в программе!.. Понятно, чем именно обусловлено такое допущение, но, так или иначе, его необходимость несколько снижает авторитет языка...

(2.3) Если программа содержит нарушение правила, которое не требует обязательного диагностирования, то данный Международный Стандарт не выдвигает требования к реализациям относительно трактовки такой программы.

Комментарий. Иными словами, программа с ошибками, не требующими диагностирования, может либо успешно выполняться, либо, наоборот, вызывать «неопределённое поведение»? То есть, мало того, что неправильная (с точки зрения Стандарта) программа может считаться правильной с точки зрения реализации — вдобавок, она ещё и может выполняться как бог на душу положит?

Комментарий. В окончательной версии стандарта допустимые диапазоны кодировок явно перечислены в Приложении E1 (фактически, это те же самые диапазоны, что и TR 10176:2003), а ссылка на этот стандарт удалена из списка нормативных документов в разд. 1.2 — возможно, потому, что доступ к нему стал платным ☺.

В обсуждении на RSDN справедливо заметили, что оригинальный фрагмент:

static const char test1 = 'x';
static const char test2 = 'x';
const bool b = &test1 != &test2; // always true

...без тени сомнения автор перевода превратил в такой:

static const char test1 = 'x';
static const char test2 = 'x';
const bool b = &test1 != &test2; // всегда false

Борис Иванович Карпов, Татьяна Баранова. C++. Специальный справочник

381 страница. Питер, 2005

В книге две части. Первая часть — справочник по основным элементам языка: термины, типы данных, операторы, приведение типов, ключевые слова, препроцессор, библиотечные функции, библиотека ввода-вывода. Вторая часть — «краткий курс программирования»: основы; указатели, массивы и строки; ввод и вывод, классы, перегрузка операторов, наследование, виртуальные функции.

Приложения: таблица ASCII-кодов, стандартные исключения.

Джеймс О. Коплиен. Программирование на C++

479 страниц. Питер, 2005

James O. Coplien. Advanced C++. Programming Styles and Idioms. Addison-Wesley, 1992

Содержание: введение, абстракция и абстрактные типы данных, конкретные типы данных, наследование, ООП, объектно-ориентированное проектирование, многократное использование программ и объекты, прототипы, эмуляция символических языков, динамическое множественное наследование, системные аспекты.

Наполовину учебник, наполовину справочник. Излагаются идиоматика и некоторые тонкости наподобие этой:

while (*cp1++ = *cp2++);

Приложения: C в среде C++, программа Shapes, ссылочные возвращаемые значения операторов, поразрядное копирование, иерархия геометрических фигур в символической идиоме, структурное программирование, список терминов.

Джеймс О. Коплиен. Мультипарадигменное проектирование для C++

235 страниц. Питер, 2005

James O. Coplien. Multi-Paradigm Design for C++. Addison-Wesley, 1999

Содержание: потребность в нескольких парадигмах, анализ общности, анализ изменчивости, анализ предметной области, объектно-ориентированный анализ, анализ области решений, простое смешивание парадигм, «переплетаем парадигмы», «дополняем область решений паттернами».

Много воды, как и в любой книге по проектированию.

16 января 2022
C++ книги
Зарегистрируйтесь и войдите, чтобы оставлять комментарии и голосовать.

Книги по C++
Книги Бьерна Страуструпа
Учебная литература. Часть I / Часть II / Часть III. Книги Герберта Шилдта / Часть IV
Русскоязычная литература. Часть I / Часть II / Часть III / Часть IV
Стандартная библиотека шаблонов
Структуры данных, алгоритмы, решение задач
Что выбрать? (Обновляется)
Также может быть интересным
© MMXI—MMXXIII. RSS. Поддержать сайт
Светлая тема / тёмная тема