P
prepair.app
Пройти интервью →
EnglishУкраїнськаРусский
🔷

Senior C++Вопросы на собеседовании C++

Senior · 5+ лет опыта

Собеседование по C++ проверяет три вещи: понимаете ли вы объектную модель, можно ли доверить вам память и знаете ли вы, чего стоит стандартная библиотека. Ниже вопросы, которые задают чаще всего, каждый с эталонным ответом. Senior: архитектуру, трейд-оффы, менторство и принятие решений.

Темы для подготовки

Память, указатели и RAII
ООП, виртуальные функции и vtable
Move-семантика и правило пяти
Шаблоны и метапрограммирование
Контейнеры STL и сложности
Многопоточность и гонки данных

5 вопросов уровня Senior с ответами

1

Как промахи кэша влияют на раскладку данных?

Ответ

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

2

Когда оправдан lock-free и чем он отличается от wait-free?

Ответ

Lock-free гарантирует, что прогресс делает хоть какой-то поток; wait-free — что каждый поток завершит операцию за ограниченное число шагов. Lock-free оправдан при реальной конкуренции на небольшой, хорошо понятой структуре — очередь, счётчик, — где мьютекс измеримо доминирует. Как выбор по умолчанию он не оправдан: такой код трудно написать верно и трудно тестировать, а неконкурентный мьютекс быстр, поэтому честный ответ начинается с измерения.

3

Объясните упорядочивание памяти в `std::atomic`.

Ответ

seq_cst стоит по умолчанию и даёт единый общий порядок для всех потоков — корректно и проще всего для рассуждений. Пара acquire/release устанавливает happens-before между освобождающей записью и захватывающим чтением: именно это внутри делает мьютекс, и этого достаточно для большинства схем производитель-потребитель. relaxed гарантирует только атомарность без порядка и уместен для чего-то вроде счётчика статистики. Ослабление порядка — измеренная оптимизация, а не точка старта.

4

Проект собирается двадцать минут. С чего начать?

Ответ

Сначала измерить: какие единицы трансляции и какие заголовки доминируют. Затем резать граф включений — предварительные объявления вместо include, PIMPL на широко включаемых классах, вынос шаблонов оттуда, где стоимость инстанцирования реальна. Дальше механические выигрыши: предкомпилированные заголовки, ccache, параллелизм, unity-сборки и линкер вроде lld или mold. Модули решают это по-настоящему там, где тулчейн к ним готов.

5

Код работает медленнее, чем должен. Какой у вас метод?

Ответ

Начинать с воспроизводимого измерения, потому что интуиция о производительности C++ ошибается достаточно часто, чтобы быть опасной. Профилировать, чтобы найти, куда действительно уходит время, и смотреть на алгоритм раньше микрооптимизаций. Проверять, что сделал оптимизатор, а не предполагать: сгенерированный код отвечает на вопросы, на которые чтение исходника ответить не может. И контролировать среду — флаги сборки, прогретые кэши, скачки частоты и шум от других процессов иначе дадут цифры, которых нет.

🦎

Прочитать ответы недостаточно

На собеседовании ты говоришь вслух под давлением. Кем задаст эти же вопросы, оценит каждый ответ и покажет, что именно подтянуть.

Пройти интервью Senior C++ →
Бесплатно · 3 интервью в месяц

Другие уровни — C++

Junior C++Middle C++Все вопросы C++

Другие специализации

🔍Senior QA Manual🤖Senior QA AutomationSenior Java Backend🐍Senior Python Backend🐘Senior PHP Backend🦫Senior Go Backend🟢Senior Node.js Backend💎Senior Ruby on Rails🟨Senior JavaScript⚛️Senior React Frontend