C++ geek
3.61K subscribers
277 photos
5 videos
28 links
Учим C/C++ на примерах
Download Telegram
C++: Заставьте компилятор работать за вас (constexpr и consteval)

Вы когда-нибудь хотели, чтобы ваша программа мгновенно выдавала результат сложных вычислений в момент запуска? Это возможно, если переложить тяжелую математику на... ваш компилятор!

В современном C++ мы можем «запекать» результаты функций прямо в итоговый .exe файл. Для этого есть два инструмента.

1. constexpr - «Вычисли до запуска, если сможешь» (C++11)

Ключевое слово constexpr говорит компилятору: "Если все аргументы этой функции известны заранее, вычисли её прямо сейчас. Если нет - оставь до выполнения программы (Run-time)".

Это невероятно удобно для универсальных функций.


// Функция может работать и до запуска, и во время!
constexpr int GetArea(int width, int height) {
return width * height;
}

int main() {
// 🚀 Вычислится компилятором! В код вставится просто "200".
// Zero runtime cost.
int a = GetArea(10, 20);

int w;
std::cin >> w;
// 🐢 Вычислится процессором во время работы (w неизвестно заранее).
int b = GetArea(w, 20);
}



2. consteval - «Вычисли до запуска, или умри!» (C++20)

У constexpr есть проблема: мы не всегда уверены, вычислилась ли функция компилятором, или она тихо «соскользнула» в Run-time, замедляя программу.

Поэтому в C++20 добавили consteval. Это строгий приказ (Immediate Function). Если компилятор не может выполнить функцию прямо сейчас - он выдаст ошибку компиляции.


// Обязана выполниться во время компиляции
consteval int MagicHash(std::string_view str) {
int hash = 0;
for (char c : str) hash += c;
return hash;
}

int main() {
// Отлично. Компилятор сам посчитает хэш слова "admin".
int h1 = MagicHash("admin");

std::string user_input = "test";
// ОШИБКА КОМПИЛЯЦИИ! user_input нельзя знать заранее.
int h2 = MagicHash(user_input);
}



📈 Зачем это нужно?

1. Максимальная производительность: Вы переносите время выполнения на этап сборки программы. Для пользователя всё работает за O(1).

2. Замена #define: Раньше константы и простые формулы писали через макросы препроцессора. Теперь constexpr делает это безопасно, с проверкой типов.

3. Безопасность: С consteval вы гарантируете, что тяжелая инициализация (например, генерация таблиц поиска) не ударит по производительности в продакшене.

💡Итог: Пишете математику или чистые функции без побочных эффектов? Ставьте constexpr.
Хотите 100% гарантию, что вычисления не попадут в готовый бинарник? Ставьте consteval.

#cpp #cpp20 #constexpr #optimization #performance #coding #tips

➡️ @cpp_geek
👍53