
Оптимизации компилятора в C++: что ревьюить на самом деле
Компилятор выбрасывает половину кода, переставляет операции и удаляет проверки на переполнение. Разбираем, какие места в C++ ломаются от оптимизаций и что искать глазами на ревью.

Компилятор выбрасывает половину кода, переставляет операции и удаляет проверки на переполнение. Разбираем, какие места в C++ ломаются от оптимизаций и что искать глазами на ревью.

Сервис работал в отладочной сборке и падал в релизе только под пиковой нагрузкой. Разбираем, как UB даёт компилятору право переписывать логику и почему проблема всплывает именно под нагрузкой.

Почему два потока, которые «просто читают и пишут переменную», дают результат, невозможный ни при какой последовательности операций. Разбор модели памяти C++11 и далее: happens-before, барьеры, порядки memory_order.

На что смотреть в C++-ревью, кроме форматирования: владение ресурсами, время жизни ссылок, исключения и переполнения. Конкретные формулировки замечаний вместо «поправьте качество кода».

co_await не блокирует поток и не создаёт нового — компилятор разбивает функцию на состояния и складывает их в кучу. Разбираем, что генерируется, когда происходит выделение памяти и где это бьёт по производительности.

Concepts, ranges, std::format, std::expected: разбираем, какие возможности C++20 и C++23 действительно используются в рабочем коде, чем платишь за каждую и где компиляторы ещё догоняют стандарт.

Скалярный цикл суммирования float обрабатывает по одному числу за такт, а SSE берёт четыре, AVX2 — восемь. Разбираем, почему автовекторизация ломается на ровном месте и когда стоит спускаться до интринсиков.

Lock-free очередь звучит как способ выжать всё из многопоточности, но на практике чаще проигрывает мьютексу. Разбираем, где atomic реально помогает, а где добавляет багов и не даёт прироста.

Сервис работал месяцами, а после пересборки базового образа начал падать с SIGSEGV на пиковом трафике. Разбираем, как несовпадение ABI переживает сборку и линковку и всплывает именно под нагрузкой.

Шаблонная магия экономит время выполнения, но платит за это временем компиляции и памятью. Разбираем, где именно горит компилятор и как это измерить в C++17/20.

Почему SFINAE молчит вместо ошибки, как компилятор проверяет concept и во что превращается CRTP на этапе кодогенерации — разбор механики трёх приёмов, а не их синтаксиса.

Вы написали std::move, а копирование всё равно произошло. Разбираем случаи, когда перемещение тихо превращается в копию, и как это увидеть на компиляторе, а не в профайлере под нагрузкой.