Вопросы по C++
Разбирает то, на чём валят C++-разработчиков: неопределённое поведение, владение памятью, move-семантику, шаблоны, устройство STL и модель памяти. После трека вы объясните, что происходит в коде на уровне объектов, кеша и линковщика.
Проверьте себя: тест по C++
20 вопросов, 10 минут, уровень junior, middle или senior
Типы и неопределённое поведение
Целочисленные типы и продвижения, переполнение, UB, implementation-defined и unspecified, strict aliasing.
Урок: Типы и неопределённое поведение 6 мин- Порядок байтов: перевернуть uint32 и посчитать единицы
- Умножение int64 с проверкой переполнения
- Середина двух int64 без переполнения
- std::bit_cast
- Что C++20 изменил для знаковых целых
- Порядок вычисления аргументов функции
- Объясни, что такое неопределённое поведение
- Продвижение unsigned char
Ещё 14 вопросов и задач
- Размер long на Windows и Linux
- Сопоставьте пример и вид поведения
- Почему проверка x + 1 < x исчезла
- Что выведет: арифметика с char и bool
- Что выведет: преобразования и обрезание
- Что выведет: беззнаковое вычитание и деление
- Как безопасно проверить переполнение
- Как искать UB
- Сдвиги в C++20
- Сравнение -1 и 1u
- Перетолковать float как биты
- UB, implementation-defined, unspecified
- Чтение неинициализированной переменной
- Что из этого неопределённое поведение
Указатели и ссылки
Адреса, арифметика указателей, const в разных позициях, висячие ссылки, nullptr, массивы и их распад.
Урок: Указатели и ссылки без висячих концов 5 мин- Удалить узлы списка с заданными значениями
- Кольцевой буфер для логов
- Повернуть матрицу, хранящуюся одним буфером
- Указатель за конец массива
- sizeof массива-параметра
- const до и после звёздочки
- Откуда берутся висячие ссылки
- Сопоставьте объявление и его смысл
Ещё 11 вопросов и задач
- nullptr против NULL в перегрузке
- Указатель «за последним»
- Что выведет: арифметика указателей и ссылки
- Что выведет: указатель по значению и по ссылке
- Как читать объявления с const
- Ссылка на локальную переменную
- std::span
- Продление жизни временного объекта
- Ссылка на элемент вектора после push_back
- Главное отличие ссылки от указателя
- Когда указатель, когда ссылка
RAII и умные указатели
Время жизни объектов, unique_ptr, shared_ptr и weak_ptr изнутри, make_shared, циклы владения.
Урок: RAII и умные указатели 6 мин- Модель shared_ptr: кто и когда уничтожится
- Дерево на unique_ptr: перенос и удаление поддеревьев
- Управляющий блок shared_ptr
- Пользовательский удалитель
- Цикл из shared_ptr
- delete для new[]
- Объясни RAII на примерах
- Чем make_shared лучше shared_ptr(new T)
Ещё 11 вопросов и задач
- Что происходит, когда умирает последний shared_ptr
- Что выведет: порядок конструкторов и деструкторов
- Что выведет: use_count и weak_ptr
- Ревью: ручное управление памятью
- shared_ptr из this
- Потокобезопасность shared_ptr
- Какой умный указатель выбрать
- Копирование unique_ptr
- Цена unique_ptr
- weak_ptr::lock
- Что такое RAII
Правило 0/3/5
Специальные функции-члены: когда их генерирует компилятор, когда удаляет, и как писать классы без утечек.
Урок: Правило 0/3/5: специальные функции-члены 5 мин- Длинная арифметика: класс BigUint и факториал
- Класс матрицы 2×2 и быстрое возведение в степень
- Что даёт copy-and-swap
- Как написать оператор присваивания
- Куда пропал конструктор по умолчанию
- Пустой деструктор и перемещение
- Когда не генерируется перемещение
- Что объявили и что сгенерирует компилятор
Ещё 11 вопросов и задач
- Объявили перемещающий конструктор
- Почему move должен быть noexcept
- Что выведет: деструктор отключил перемещение
- Что выведет: гарантированный пропуск копирования
- Что выведет: какие специальные функции вызваны
- Член-ссылка и присваивание
- Правило трёх
- Правило нуля
- Правила 0, 3 и 5
- Самоприсваивание
- Шесть специальных функций
Move-семантика
Категории значений, rvalue-ссылки, std::move и std::forward, noexcept-перемещение, copy elision.
Урок: Move-семантика и perfect forwarding 6 мин- Перенос между складами: map::extract без копий
- Топ участников: сортировка записей без копий строк
- lvalue, prvalue, xvalue
- std::move от const-объекта
- push_back и emplace_back
- std::exchange в перемещении
- Объясни move-семантику
- Допишите обёртку с perfect forwarding
Ещё 12 вопросов и задач
- move или forward в шаблоне
- Что такое T&& в шаблоне
- Состояние после перемещения
- Что выведет: std::move и const
- Что выведет: push_back против emplace_back
- Что выведет: forwarding и перегрузка по категории
- Perfect forwarding
- Схлопывание ссылок
- return std::move(local)
- Категории значений
- Перемещение без noexcept и vector
- Что делает std::move
Шаблоны и концепты
Вывод типов, специализация, SFINAE, variadic templates, концепты и requires в C++20.
Урок: Шаблоны и концепты 6 мин- Дерево отрезков с операцией как параметром шаблона
- Обобщённая функция статистики для чисел и строк
- Один бинарный поиск на все случаи: предикат как параметр шаблона
- Зачем концепты
- Концепты против SFINAE
- Вывод аргументов шаблона класса
- Вывод T при передаче по значению
- Член зависимой базы
Ещё 12 вопросов и задач
- extern template
- Fold-выражения
- Как компилируются шаблоны
- if constexpr в шаблоне
- Почему шаблоны в заголовках
- Возможность шаблонов и стандарт, где она появилась
- Что выведет: шаблон против обычной функции
- Что выведет: sizeof..., fold и статический член шаблона
- Частичная специализация функции
- requires-выражение
- Что такое SFINAE
- Зачем typename
Контейнеры STL изнутри
vector, deque, list, map, unordered_map: устройство, сложность, инвалидация итераторов.
Урок: Контейнеры STL изнутри 6 мин- deque: что инвалидирует push_back
- Удаление в цикле по итератору
- Категории итераторов
- Коэффициент заполнения
- Чтение через operator[]
- Как устроен std::map
- map или unordered_map
- Контейнер и его устройство
Ещё 15 вопросов и задач
- multiset::erase(value)
- Что выведет: map и operator[]
- Что выведет: remove, erase и multiset
- reserve и resize
- try_emplace и insert_or_assign
- Перехеширование unordered_map
- Особенность vector<bool>
- Как растёт vector
- Сложность push_back
- Бронирование переговорки на std::map
- Двусторонняя очередь с доступом по индексу
- LRU-кеш на list и unordered_map
- Таблица результатов на multiset: удаление одного вхождения
- Планировщик задач на priority_queue
- Прямоугольники по точкам: хеш для пары координат
Алгоритмы STL и ranges
sort, nth_element, remove-erase, бинарный поиск, требования к компаратору, std::ranges.
Урок: Алгоритмы STL и ranges 5 мин- Тип результата accumulate
- Компаратор с <=
- std::erase_if
- Идиомы удаления
- lower_bound и upper_bound
- Медиана без полной сортировки
- Что выведет: accumulate, count_if, partial_sum
- Что выведет: stable_partition, rotate, unique
Ещё 15 вопросов и задач
- Проекции в ranges
- Почему remove не уменьшает vector
- Сложность std::sort
- Как устроен std::sort
- std::sort для std::list
- Стабильность std::sort
- Перетащить выбранные элементы
- Ленивость views
- Зачем алгоритмы вместо циклов
- Сжатие координат: sort, unique, lower_bound
- Собрать выделенные файлы в точку вставки
- Следующая перестановка
- k-я по величине зарплата без полной сортировки
- Операции над отсортированными мультимножествами
- Сортировка таблицы кликами по колонкам
Лямбды и функциональные объекты
Захваты, mutable, generic-лямбды, std::function и его цена, висячие захваты.
Урок: Лямбды и функциональные объекты 5 мин- Конвейер фильтров из лямбд
- Рекурсивная лямбда с мемоизацией: разбиения числа
- Когда копируется захват по значению
- Висячий захват по ссылке
- Лямбда как указатель на функцию
- std::function или шаблон
- Generic-лямбда
- Немедленно вызываемая лямбда
Ещё 11 вопросов и задач
Исключения
Раскрутка стека, гарантии безопасности, noexcept, исключения в деструкторах и конструкторах, std::expected.
Урок: Исключения и гарантии безопасности 5 мин- Как ловить исключения
- Сколько стоят исключения
- Если бросил конструктор
- Исключение из деструктора
- Исключение между потоками
- std::expected
- Строгая гарантия исключений
- Бросок из noexcept-функции
Ещё 10 вопросов и задач
Многопоточность и модель памяти
thread, mutex, condition_variable, atomic, memory_order, гонки данных и дедлоки.
Урок: Многопоточность и модель памяти 6 минПроизводительность и кеш
Кеш-линии, локальность, false sharing, аллокации, ветвления, профилирование.
Урок: Производительность и кеш 6 минСборка и линковка
Единицы трансляции, препроцессор, ODR, inline, статические и динамические библиотеки, CMake.
Урок: Сборка и линковка 6 мин- Безымянное пространство имён
- PUBLIC, PRIVATE, INTERFACE в CMake
- extern "C"
- Команды сборки вручную
- Зачем include guards
- inline-переменные
- Порядок статических библиотек
- Name mangling
Ещё 9 вопросов и задач
- Правило одного определения
- Функция, определённая в заголовке
- От исходника до исполняемого файла
- Этапы сборки
- Порядок инициализации глобальных объектов
- Статическая или динамическая библиотека
- Откуда undefined reference
- Какие файлы перекомпилировать после изменения заголовков
- Модель линковщика: порядок статических библиотек
Современный C++20/23
Модули, корутины, spaceship, ranges, std::format и std::print, std::expected, deducing this.
Урок: Современный C++: C++20 и C++23 5 мин