我们如何在编译时动态分配?constexpr
operator new
只是在堆栈上分配内存吗?
它不分配全部。编译器在计算结果时会评估包含分配和释放的函数的结果。
例如
constexpr int triangle_number(int n)
{
std::vector<int> intermediate(n);
std::iota(intermediate.begin(), intermediate.end(), 0);
return std::accumulate(intermediate.begin(), intermediate.end(), 0);
}
std::array<int, triangle_number(5)> arr; // compiler somehow produces 15
没有constexpr new
运算符。
自C ++ 20起,在仅使用可替换分配全局函数的情况下,可以在new
表达式中使用constexpr
运算符(这意味着您不使用展示位置new
或用户定义的分配函数),并在同一表达式中取消分配数据。
因此,在您的最终程序中,这不会分配数据,因为您最终只会得到constexpr
表达式的最终结果。