🚀 Микро-оптимизация в C++20: Early Return + Атрибуты вероятности
В прошлом посте мы разобрали, как Early Return (ранний возврат) спасает нас от вложенных
Встречайте атрибуты
🧠 В чем суть?
Современные процессоры пытаются предсказать, какую ветку кода программа выполнит следующей (Branch Prediction). Если процессор угадал - всё летает. Если ошибся - теряем такты на очистку конвейера.
С помощью атрибутов мы даем компилятору (и процессору) «инсайд»: какая ветка будет выполняться чаще.
🛠 Как это выглядит в коде?
Обычно ошибки и проверки аргументов (Guard Clauses) срабатывают редко. Это идеальное место для
⚙️ Что происходит под капотом?
Компилятор переставит инструкции ассемблера так, чтобы «счастливый путь» шел линейно, без прыжков (jmp), что улучшает работу кэша инструкций. Код обработки ошибок (ветка
⚠️ Важный нюанс:
Используйте это только тогда, когда вы уверены в вероятностях (например, ошибки случаются в 1 случае из 1000). Если поставить атрибуты наугад, можно сделать только хуже (pessimization).
🔥 Итог:
Чистый код (
#cpp #cpp20 #coding #optimization #tips #programming
➡️ @cpp_geek
В прошлом посте мы разобрали, как Early Return (ранний возврат) спасает нас от вложенных
if и делает код чище. Но в C++20 мы можем сделать этот код еще и потенциально быстрее!Встречайте атрибуты
[[likely]] и [[unlikely]].🧠 В чем суть?
Современные процессоры пытаются предсказать, какую ветку кода программа выполнит следующей (Branch Prediction). Если процессор угадал - всё летает. Если ошибся - теряем такты на очистку конвейера.
С помощью атрибутов мы даем компилятору (и процессору) «инсайд»: какая ветка будет выполняться чаще.
🛠 Как это выглядит в коде?
Обычно ошибки и проверки аргументов (Guard Clauses) срабатывают редко. Это идеальное место для
[[unlikely]].
void ProcessImage(Image* img) {
// 1. Проверка на null.
// Это случается редко, помечаем как "маловероятно".
if (img == nullptr) [[unlikely]] {
return; // Компилятор уведет этот код "подальше" из горячего пути
}
// 2. Еще одна проверка
if (img->IsEmpty()) [[unlikely]] {
return;
}
// --- Happy Path ---
// Процессор сразу прыгнет сюда, ожидая, что проверки выше ложны.
img->ApplyFilter();
img->Save();
}
⚙️ Что происходит под капотом?
Компилятор переставит инструкции ассемблера так, чтобы «счастливый путь» шел линейно, без прыжков (jmp), что улучшает работу кэша инструкций. Код обработки ошибок (ветка
[[unlikely]]) будет сдвинут в конец функции или в «холодную» зону.⚠️ Важный нюанс:
Используйте это только тогда, когда вы уверены в вероятностях (например, ошибки случаются в 1 случае из 1000). Если поставить атрибуты наугад, можно сделать только хуже (pessimization).
🔥 Итог:
Чистый код (
Early Return) + Подсказки компилятору ([[unlikely]]) = Читаемость и Производительность.#cpp #cpp20 #coding #optimization #tips #programming
➡️ @cpp_geek
🔥11