• A
  • A
  • A
  • АБВ
  • АБВ
  • АБВ
  • А
  • А
  • А
  • А
  • А
Обычная версия сайта

Бакалаврская программа «Программная инженерия»

Современные стандарты языка С++

2020/2021
Учебный год
RUS
Обучение ведется на русском языке
5
Кредиты
Статус:
Курс по выбору
Когда читается:
3-й курс, 3, 4 модуль

Преподаватель


Воробьев Даниил Владимирович

Программа дисциплины

Аннотация

Курс "Современные стандарты С++" является логическим продолжением курса "Инженерный подход к программированию на С/С++". В рамках данного курса рассматриваются ключевые механизмы и особенности, привнесенные в язык программирования С++ современными стандартами (С++11/С++14/С++17). Особое внимание уделяется объяснению логики работы нововведений, их реализации. Все также большое внимание уделяется практическим заданиям, которые при сдаче проходят этап автоматического тестирования и дальнейшего код-ревью. Курс читается в 3-4 модулях.
Цель освоения дисциплины

Цель освоения дисциплины

  • Уверенно знать стандартную библиотеку шаблонов со всеми нововведениями
  • Понимать move-семантику и уметь использовать ее в коде
  • Понимать основные принципы метапрограммирования и уметь использовать данные подходы при решении прикладных задач
  • Понимать и уметь использовать лямбда-функции
  • Знать понятие рефлексии и уметь использовать ее в С++
Содержание учебной дисциплины

Содержание учебной дисциплины

  • Итераторы
    Категории итераторов: LegacyInputIterator, LegacyOutputIterator, LegacyForwardIterator, LegacyBidirectionalIterator, LegacyRandomAccessIterator Обратный итератор Константый итератор Функция std::copy
  • Move семантика
    Мотивировка move семантики Мотивировка введения в язык rvalue reference Реализация std::move Различные реализации move конструктора Различные реализации move оператора присваивания, std::exchange Rule of five Rule of zero Дизъюнктивное разбиение выражений в xvalue, prvalue, lvalue Дизъюнктивное разбиение rvalue выражений в xvalue, prvalue Принадлежность идентификатора к lvalue Принадлежность function call expression к xvalue, prvalue, lvalue в зависимости от возвращаемого типа Добавление noexcept спецификатора к move оператору присваивания и замер производительности Коллапсирование ссылок Мотивировка введения в язык universal reference Реализация make_unique Реализация std::forward Подводные камни с std::forward и std::move Подвязка (binding) ссылок к выражениям Порядок отбора перегрузок Реализация std::unordered_map Реализация std::optional Реализация std::variant
  • Аллокаторы
    Различия в аллокаторах до и после C++11 Требования к методам: allocate, deallocate, max_size, construct, destroy Требования к выражениям взаимоотношения между экземплярами аллокатора (Relationship between instances) Метод select_on_container_copy_construction Алиасы: propagate_on_container_copy_assignment , propagate_on_container_move_assignment, propagate_on_container_swap Применение std::allocator_traits Применение rebind Реализация std::allocator с std::list
  • Умные указатели
    Мотивировка введения std::unique_ptr, std::shared_ptr, std::weak_ptr и объявление std::auto_ptr как deprecated Отсутствие у std::unique_ptr конструктора копирования Наличие у std::unique_ptr частичной специализации для массивов Шаблонный параметр Deleter Реализация подсчета ссылок внутри класса. Вынесение подсчета ссылок в ControlBlock Состав ControlBlock. Атомарность счетчика ссылок и реализация в LLVM Реализация std::make_shared Назначение std::weak_ptr Назначение метода lock в std::weak_ptr Замер производительности при конструировании std::unique_ptr, с raw_ptr и std::make_unique Замер производительности при конструировании std::shared_ptr, с raw_ptr и std::make_shared Семантика аргумента функции, когда он: экземпляр класса raw_ptr ссылка std::unique_ptr Std::shared_ptr Реализация std::shared_ptr, std::weak_ptr как в LLVM
  • Лямбда-функции
    Эквивалентность лямбды перегрузке operator(). Ассемблерное представление Различия в захвате по [&], [=] ,[&t=...], [t =...] Значение this в лямбдах Передача лямбды внутри одной единицы трансляции Передача лямбды между разными единицами трансляции Обобщенные лямбды (generic lambdas). Переменное число аргументов (variadic arguments) в лямбдах Реализация tuple и length std::forward в лямбдах до C++20 Список шаблонных параметров в лямбдах std::forward и лямбдах после C++20 Ключевое слово static в лямбдах. Изменение внутреннего состояния внутри лямбды с mutable Зависимость возможности копирования лямбды от возможности копирования захваченных данных
  • SFINAE
    Определение термина SFINAE Завязка срабатывания SFINAE на well-formed / ill-formed выражения Мотивировка использования SFINAE на примере std::add_lvalue_reference std::void_t как инструмент для реализации type_traits Разлчиие в конструкциях decltype(x) и decltype((x)) Примеры комбинаций decltype и declval для провоцирования SFINAE Реализация is_static_castable Реализация std::is_assignable Реализация std::is_polymorphic Реализация std::enable_if Реализация std::conditional Реализация std::is_copy_constructible как в LLVM Реализация std::is_nothrow_constructible как в LLVM Реализация std::move_if_noexcept как в LLVM Применение SFINAE: условный explicit конструктор для offset_ptr, улучшение сообщения об ошибки на примере pointer_to в pointer_traits
  • сonstexpr
    У constexpr функции parameter type и return type должны быть literal type Невозможность указания constexpr для виртуальных методов до C++20 Тело constexpr функции до и после C++14 Необходимость инициализации non-static членов Возможность использования constexpr переменных и constexpr функций в точках использования константных выражений (constant expressions) Отсутствие гарантии вычисления выражения в compile time при указании constexpr
  • Концепты
    Мотивировка введения концептов на примере поиска минимального элемента (std::min_element) и отсутствия информативной ошибки при попытке создания вектора ссылок Синтаксис концептов Извлечение ограничений / требований из алгоритма std::min_element для построения концептов Сущности, на которые можно наложить концепты: класс шаблонная переменная (variable template) шаблонный алиас шаблонные поля (template members) шаблонная функция Реализация концетов: ObjectType, std::floating_point, std::copyable
  • Многопоточное программирование I
    Причина введения потоков в стандарт Создание потока с std::thread. Передача в поток функции на исполнение Методы join и detach Определение терминов race condition и data race Определение термина критическая секция std::mutex методы lock и unlock RAII: std::lock_guard, std::unique_lock Структуры std::defer_lock_t, std::adopt_lock_t, std::try_lock_t Определение термина deadlock Захват нескольких мьютексов std::lock и std::scoped_lock Задача о философах std::conditional_variable методы: wait, wait_for, wait_for, wait_until, notify_one, notify_all Реализация класса TokenPool Гарантия thread-safe инициализации static переменных в C++11 Использование std::call_once, std::once_flag для гарантирования ровно одного thread-safe присваивания значения полю класса и последующих thread-safe обращений к этому полю на примере класса Logger Реализация std::shared_mutex (R/W lock) std::counting_semaphore, std::binary_semaphore Реализация std::counting_semaphore Барьеры (C++20) : одноразовый std::latch, многоразовый std::barrier
  • Многопоточное программирование II
    Определение гарантии lock-free std::atomic методы, load, store, fetch_add, fetch_sub, ++, -- Различие между compare_exchange_weak, compare_exchange_strong Реализация Append для односвязного списка Проблема ABA Реализация lock-free stack
Элементы контроля

Элементы контроля

  • неблокирующий практические задания
  • неблокирующий Итоговый экзамен по курсу в четвертом модуле
Промежуточная аттестация

Промежуточная аттестация

  • Промежуточная аттестация (4 модуль)
    0.4 * Итоговый экзамен по курсу в четвертом модуле + 0.6 * практические задания
Список литературы

Список литературы

Рекомендуемая основная литература

  • О’Двайр А. - Осваиваем C++17 STL - Издательство "ДМК Пресс" - 2018 - 352с. - ISBN: 978-5-97060-663-6 - Текст электронный // ЭБС ЛАНЬ - URL: https://e.lanbook.com/book/116126

Рекомендуемая дополнительная литература

  • Herlihy, M., & Shavit, N. (2012). The Art of Multiprocessor Programming, Revised Reprint. Burlington: Morgan Kaufmann. Retrieved from http://search.ebscohost.com/login.aspx?direct=true&site=eds-live&db=edsebk&AN=460894