🍕 constexpr аллокации в C++20: new при компиляции — 28 мая 2026 г. в 09:42:28.953
🍕 constexpr аллокации в C++20: new при компиляции 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 — это песочница: компилятор позволяет работать с динамической памятью, но не выпускает её наружу.

