constexpr и время компиляции
Вычисляйте значения во время компиляции
«constexpr и время компиляции» — бесплатный урок C++ Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения C++ Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс C++ Academy содержит 4 уроков всего.
Что означает вычисление во время компиляции
constexpr сообщает компилятору, что значение или функцию можно вычислить во время компиляции, получив настоящую константу времени компиляции.
#include <iostream>
int main() {
constexpr int size = 4 * 4; // computed at compile time
int arr[size];
std::cout << sizeof(arr) / sizeof(int) << "\n";
}Функции, вычисляемые во время компиляции
Функция constexpr может выполняться во время компиляции, если ей переданы константные аргументы, а в остальных случаях — во время выполнения.
#include <iostream>
constexpr int square(int x) { return x * x; }
int main() {
constexpr int s = square(5); // compile time
int n = 6;
std::cout << s << " " << square(n) << "\n"; // second at runtime
}Константы времени компиляции в массивах
Поскольку значения constexpr известны во время компиляции, их можно использовать для задания размера массивов и в качестве аргументов шаблонов.
Вычисления во время компиляции и константность
const означает «нельзя изменить», а constexpr — «известно во время компиляции». Каждое constexpr неявно является константным, но не каждая константа является constexpr.
#include <iostream>
int main() {
int x;
std::cin >> x;
const int a = x; // const but runtime value
constexpr int b = 10; // compile-time constant
std::cout << b << "\n";
}Рекурсивные вычисления во время компиляции
Функции constexpr могут быть рекурсивными, благодаря чему компилятор вычисляет, например, факториалы ещё до запуска программы.
#include <iostream>
constexpr long factorial(int n) {
return n <= 1 ? 1 : n * factorial(n - 1);
}
int main() {
constexpr long f = factorial(5); // 120 at compile time
std::cout << f << "\n";
}Расширенные вычисления во время компиляции в современном C++
Начиная с C++14 функции constexpr могут содержать циклы, локальные переменные и ветвления, что позволяет вычислять сложные константы во время компиляции.
#include <iostream>
constexpr int sumTo(int n) {
int total = 0;
for (int i = 1; i <= n; ++i) total += i;
return total;
}
int main() {
constexpr int s = sumTo(100);
std::cout << s << "\n";
}Переменные constexpr должны инициализироваться во время компиляции
Переменная, объявленная как constexpr, должна иметь инициализатор, вычислимый во время компиляции, иначе программа не скомпилируется.
Преимущества вычислений во время компиляции
Вычисления во время компиляции означают отсутствие затрат во время выполнения, возможность использовать значения в константных контекстах и более раннее обнаружение ошибок.
Вычисления во время компиляции и шаблоны
Значения constexpr естественно сочетаются с шаблонами и std::array, где размеры и параметры должны быть константами времени компиляции.
Когда вычисления переходят во время выполнения
Если функция constexpr получает неконстантные аргументы, она просто выполняется во время выполнения, как обычная функция, — ошибки нет.
Предпочитайте constexpr для констант
Используйте constexpr для настоящих констант: размеров, математических вычислений и таблиц поиска. Это выразительнее, чем const, и позволяет компилятору гарантировать вычисление во время компиляции.
Быстрая проверка
Проверьте, насколько хорошо Вы поняли вычисления во время компиляции.
Итоги
Вы узнали, что constexpr позволяет вычислять переменные и функции во время компиляции, отличается от const, которое лишь запрещает изменение, поддерживает циклы и рекурсию в современном C++ и переходит к выполнению во время выполнения при получении неконстантных входных данных.
Часто задаваемые вопросы
Урок «constexpr и время компиляции» бесплатный?
Да — полный текст урока «constexpr и время компиляции» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс C++ Academy, подпишись на CoddyKit PRO. Курс C++ Academy содержит 4 уроков всего.
Чему я научусь в уроке «constexpr и время компиляции»?
Вычисляйте значения во время компиляции Ты практикуешь C++ Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать C++ Academy?
Предыдущий опыт не требуется. C++ Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.
Сколько времени занимает урок «constexpr и время компиляции»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке C++ Academy?
Да. Каждый урок C++ Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Константные переменные и параметры
- Константные функции-члены
- constexpr и время компиляции
- consteval и constinit