Почему я не могу сделать что-то вроде этого:
int size = menu.size;
int list[size];
В любом случае, вместо использования вектора? (массивы быстрее, поэтому я хотел использовать массивы)
спасибо
Почему я не могу сделать что-то вроде этого:
int size = menu.size;
int list[size];
В любом случае, вместо использования вектора? (массивы быстрее, поэтому я хотел использовать массивы)
спасибо
Размер должен быть известен во время компиляции, так как компилятору необходимо знать, сколько будет пространства стека, чтобы выделить для него достаточно памяти. (Edit: Я стою исправлено. В C, массивы переменной длины могут быть выделены в стеке. Однако С++ не допускает массивы переменной длины.)
Но вы можете создавать массивы в куче во время выполнения:
int* list = new int[size];
Просто убедитесь, что вы освободили память, когда закончите, или вы получите утечку памяти:
delete [] list;
Обратите внимание, что очень легко случайно создать утечку памяти, и вектор почти наверняка проще в использовании и обслуживании. Векторы довольно быстрые (особенно если вы reserve()
их до нужного размера вначале), и я настоятельно рекомендую использовать вектор вместо ручного управления памятью.
В целом, неплохо прокомментировать ваш код, чтобы узнать, где настоящие узкие места, чем микро-оптимизировать фронт (потому что оптимизация не всегда оптимизация).
Как говорили другие, разработчики языка С++ решили не допускать массивы переменной длины, VLA, несмотря на то, что они доступны на C99. Однако, если вы готовы сделать немного больше работы самостоятельно, и вы просто отчаянно хотите выделить память в стеке, вы можете использовать alloca()
.
Тем не менее, я лично использовал бы std::vector
. Это проще, безопаснее, удобнее и, вероятно, достаточно быстро.
С++ не допускает массивы переменной длины. Размер должен быть известен во время компиляции. Поэтому вы не можете этого сделать.
Вы можете использовать векторы или new
.
vector<int> list;
или
int *list = new int[size];
Если вы поедете с последним, вам нужно освободить его позже:
delete[] list;
быстрее, поэтому я хотел использовать массивы
Это неверно. Откуда вы это слышали?
В С++ длина массива должна быть известна во время компиляции, чтобы выделить ее в стеке.
Если вам нужно выделить массив, размер которого вы не знаете во время компиляции, вам нужно выделить его в куче, используя operator new[]
int size = menu.size;
int *list = new int[size];
Но поскольку у вас есть новая память в куче, вам нужно убедиться, что вы правильно ее удаляете, когда закончите с ней.
delete[] list;
в первую очередь, векторы не значительно быстрее. по той причине, почему вы не можете сделать что-то вроде этого:
код будет выделять массив в стеке. компиляторы должны знать этот размер заранее, чтобы они могли его учитывать. поэтому вы можете использовать только константы с этим синтаксисом.
простой способ создания массива в куче: int list = new int[size];
Не забудьте позже delete[]
.
Однако, если вы используете вектор и сохраняете правильный размер upfront + скомпилировать с оптимизацией, должно быть мало, что абсолютно не накладные расходы.
AFAIK В С++ 03 нет массивов переменной длины (VLA):
вы, вероятно, захотите сделать это:
const int size = menu.size;
int list[size]; // size is compile-time constant
или
int *list = new int[size]; // creates an array at runtime;
delete[] list; // size can be non-const
Так как в стеке выделяется list
, его размер должен быть известен во время компиляции. Но здесь size
неизвестно до времени выполнения, поэтому размер list
неизвестен во время компиляции.