Stack_array в основных принципах С++

В основных принципах С++ упоминается что-то, называемое stack_array. Его использование выглядит следующим образом:

const int n = 7;
int m = 9;

void f()
{
    std::array<int, n> a1;
    stack_array<int> a2(m);  // A stack-allocated array.
                             // The number of elements are determined
                             // at construction and fixed thereafter.
    // ...
}

Но как можно реализовать такой класс? Как мы можем динамически определять размер стека во время выполнения?

Ответ 1

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

Самое близкое, что вы можете получить - это макрос, который оборачивает вызов alloca (нестандартная функция, которая поддерживается многими компиляторами). Смотрите roalz answer для ссылки на конкретную реализацию. Я не уверен, что такой подход может обеспечить какую-либо безопасность, которая недостижима для VLA (еще одна нестандартная функция, поддерживаемая многими компиляторами), что не означает, что VLA безопасен в использовании.

Ответ 2

Просто в Интернете, я нашел одну возможную (несколько старую) реализацию здесь:
https://tlzprgmr.wordpress.com/2008/04/02/c-how-to-create-variable-length-arrays-on-the-stack/
По-видимому, он использует макросы alloca() и препроцессора (как это предлагается и подтверждается другими комментариями и ответами).