⏳ C++: Заставьте компилятор работать за вас (
Вы когда-нибудь хотели, чтобы ваша программа мгновенно выдавала результат сложных вычислений в момент запуска? Это возможно, если переложить тяжелую математику на... ваш компилятор!
В современном C++ мы можем «запекать» результаты функций прямо в итоговый
1.
Ключевое слово
Это невероятно удобно для универсальных функций.
2.
У
Поэтому в C++20 добавили
📈 Зачем это нужно?
1. Максимальная производительность: Вы переносите время выполнения на этап сборки программы. Для пользователя всё работает за O(1).
2. Замена
3. Безопасность: С
💡Итог: Пишете математику или чистые функции без побочных эффектов? Ставьте
Хотите 100% гарантию, что вычисления не попадут в готовый бинарник? Ставьте
#cpp #cpp20 #constexpr #optimization #performance #coding #tips
➡️ @cpp_geek
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
👍5❤3