Переменная длина 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();
}
Но. Все содержимое вектора будет храниться в куче, а не в стеке. Проблема заключается в том, что компилятор должен знать, сколько места должно быть выделено для функции до ее выполнения, поэтому просто невозможно хранить данные переменной длины в стеке.