Переменная длина std:: array like

Поскольку мои обычно используемые компиляторы С++ допускают массивы переменной длины (например, массивы в зависимости от размера времени выполнения), мне интересно, есть ли что-то вроде std::array с переменным размером? Конечно, std::vector имеет переменный размер, но он выделяется на кучу и перераспределяется по необходимости.

Мне нравится иметь выделенный стек стек с размером, определенным во время выполнения. Есть ли std -template, который может содержать это? Может быть, используя std::vector с фиксированным максимальным размером?

Ответ 1

В настоящее время разрабатываются два предложения, чтобы довести на С++ массивы фиксированного размера времени выполнения, которые могут вас заинтересовать:

  • Массивы размера времени выполнения с автоматическим временем хранения. Это сделало бы размерные массивы времени выполнения языковой функцией (например, на C11). Таким образом, вы можете сделать:

    void foo(std::size_t size) {
      int arr[size];
    }
    
  • С++ Dynamic Arrays. Это приведет к появлению нового контейнера в библиотеке, std::dynarray, которому при строительстве будет задан фиксированный размер. Он должен быть оптимизирован для размещения в стеке, когда это возможно.

    void foo(std::size_t size) {
      std::dynarray<int> arr(size);
    }
    

Они оба обрабатываются как часть технической спецификации расширений массивов, которые будут выпущены вместе с С++ 14.

Ответ 2

Как отметил Даниэль в комментарии, размер std::array указан как параметр шаблона, поэтому он не может быть установлен во время выполнения.

Вы можете построить std::vector, передав минимальную емкость через параметр конструктора:

#include <vector>

int main(int argc, char * argv[])
{
    std::vector<int> a;
    a.reserve(5);
    std::cout << a.capacity() << "\n";
    std::cout << a.size();

    getchar();
}

Но. Все содержимое вектора будет храниться в куче, а не в стеке. Проблема заключается в том, что компилятор должен знать, сколько места должно быть выделено для функции до ее выполнения, поэтому просто невозможно хранить данные переменной длины в стеке.