constexpr new 如何分配内存?

How does constexpr new allocate memory?

我们如何在编译时动态分配? constexpr operator new 是否只是在堆栈上分配内存?

根本不分配。编译器评估函数的结果,该函数在计算结果时包括分配 释放。

例如

constexpr int triangle_number(int n)
{
    std::vector<int> intermediate(n + 1);
    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开始,你可以在constexpr表达式中使用new运算符,条件是你只使用可替换的全局分配函数(这意味着你不使用放置new 或用户定义的分配函数)并且您在同一表达式中解除分配数据。

因此,在您的最终程序中,这不会分配内存,因为您最终得到的只是 constexpr 表达式的最终结果。