C++20 разрешил использовать
new и delete в constexpr-функциях. Звучит дико — как можно аллоцировать память, если программа ещё не запущена?constexpr int sum() {
int* p = new int(42);
int result = *p;
delete p;
return result;
}
constexpr int x = sum(); // OK в C++20⚡️ Под капотом: компилятор моделирует кучу как часть абстрактной машины.
new создаёт объект в памяти интерпретатора, delete помечает его как освобождённый. Никакой реальной аллокации не происходит.❗️ Ключевое ограничение — transient allocation: вся память, выделенная в
constexpr-контексте, должна быть освобождена до выхода из этого контекста. Нельзя «пронести» указатель в runtime:constexpr int* leak() {
return new int(42); // Ошибка: non-transient allocation
}❗️ Это значит, что
constexpr std::vector работает: вектор аллоцирует в compile-time, используется, и деструктор освобождает. Но нельзя создать constexpr std::vector как глобальную переменную — деструктор вызовется, данные не переживут компиляцию.💡 Transient allocation — это песочница: компилятор позволяет работать с динамической памятью, но не выпускает её наружу.
📍Навигация: Вакансии • Задачи • Собесы
Библиотека C/C++ разработчика
#под_капотом