Как constexpr new распределяет память? - PullRequest
1 голос
/ 16 июня 2020

Как мы можем динамически выделять память во время компиляции? constexpr operator new просто выделяет память в стеке?

Ответы [ 2 ]

5 голосов
/ 16 июня 2020

Оператора constexpr new нет.

Начиная с C ++ 20, вы можете использовать оператор new в выражениях constexpr при условии, что вы используете только заменяемую функцию глобального распределения (это означает что вы не используете размещение new или определяемую пользователем функцию распределения) и что вы освобождаете данные в том же выражении.

Итак, в вашей последней программе это не выделяет память, поскольку вы закончится только окончательным результатом вашего выражения constexpr.

3 голосов
/ 16 июня 2020

Он вообще не выделяет . Компилятор оценивает результат функции, которая включает выделение и освобождение при вычислении ее результата.

Например

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...