constexpr new如何分配内存?

7

如何在编译时动态分配内存?constexproperator new只是在堆栈上分配内存吗?


3
这个常量表达式参考页面中的第22点似乎很相关。 - Some programmer dude
1
相关的(不确定是否仍然最新)https://dev59.com/Ga_la4cB1Zd3GeqP1Ppl - 463035818_is_not_a_number
请澄清一下,您所说的“constexpr operator new”是什么意思? - 463035818_is_not_a_number
@idclev463035818 我的问题是错误的,因为我误解了“动态分配”(或者更好地说,constexpr上下文中使用new运算符)的含义。被接受的答案澄清了一切。 - Tachi
2个回答

16

没有constexpr new运算符。

自C++20以来,您可以在只使用可替换的全局分配函数(这意味着您不使用放置new或用户定义的分配函数)并且在同一表达式中解除分配数据的条件下,在constexpr表达式中使用new运算符。

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


8
它根本不进行分配。编译器在计算函数结果时会评估包括分配和释放的函数结果。
例如:
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

小问题,但编译器输出的是10而不是15。谢谢。 - Orçun Çolak
@OrçunÇolak 哎呀,已修复。 - Caleth

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接