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() и препроцессора (как это предлагается и подтверждается другими комментариями и ответами).
Ответ 3
Реализация Microsoft GSL по-прежнему заинтересована в реализации пакета stack_array с ноября 2016 года: https://github.com/Microsoft/GSL/issues/348#issuecomment-260241339
См. также https://github.com/isocpp/CppCoreGuidelines/issues/347 и особенно https://github.com/Microsoft/GSL/issues/134, в котором говорится о том, почему это нелегко.