【问题标题】:How does constexpr new allocate memory?constexpr new 如何分配内存?
【发布时间】:2020-10-05 19:44:02
【问题描述】:

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

【问题讨论】:

标签: c++ new-operator constexpr c++20


【解决方案1】:

没有constexpr new 运算符。

从C++20开始,你可以在constexpr表达式中使用new运算符,条件是你只使用一个可替换的全局分配函数(这意味着你不使用一个放置new或用户-定义的分配函数),并且您在同一表达式中取消分配数据。

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

【讨论】:

    【解决方案2】:

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

    例如

    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 哎呀,已修复
    猜你喜欢
    • 1970-01-01
    • 2020-11-09
    • 2013-05-09
    • 1970-01-01
    • 2010-10-10
    • 1970-01-01
    • 2020-02-03
    • 2015-05-01
    • 1970-01-01
    相关资源
    最近更新 更多