• A
  • A
  • A
  • ABC
  • ABC
  • ABC
  • А
  • А
  • А
  • А
  • А
Regular version of the site
Article
Statistical testing of segment homogeneity in classification of piecewise-regular objects

Savchenko A., Belova N. S.

International Journal of Applied Mathematics and Computer Science. 2015. Vol. 25. No. 4. P. 915-925.

Article
Reconstruction of a word from a finite set of its subwords under the unit shift hypothesis. I. Reconstruction without for bidden words1

Smetanin Y., Ulyanov M.

Cybernetics and Systems Analysis. 2015. Vol. 50. No. 1. P. 148-156.

Article
VTMine Framework as Applied to Process Mining Modeling

Sergey Andreevich Shershakov.

International Journal of Computer and Communication Engineering. 2015. Vol. 4. No. 3. P. 166-179.

Modern C++ Standards

2020/2021
Academic Year
RUS
Instruction in Russian
5
ECTS credits
Type:
Elective course
When:
3 year, 3, 4 module

Instructor

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

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

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

Аннотация

Курс "Современные стандарты С++" является логическим продолжением курса "Инженерный подход к программированию на С/С++". В рамках данного курса рассматриваются ключевые механизмы и особенности, привнесенные в язык программирования С++ современными стандартами (С++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