Создание массивов на С++

Почему я не могу сделать что-то вроде этого:

int size = menu.size;
int list[size];

В любом случае, вместо использования вектора? (массивы быстрее, поэтому я хотел использовать массивы)

спасибо

Ответ 1

Размер должен быть известен во время компиляции, так как компилятору необходимо знать, сколько будет пространства стека, чтобы выделить для него достаточно памяти. (Edit: Я стою исправлено. В C, массивы переменной длины могут быть выделены в стеке. Однако С++ не допускает массивы переменной длины.)

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

int* list = new int[size];

Просто убедитесь, что вы освободили память, когда закончите, или вы получите утечку памяти:

delete [] list;

Обратите внимание, что очень легко случайно создать утечку памяти, и вектор почти наверняка проще в использовании и обслуживании. Векторы довольно быстрые (особенно если вы reserve() их до нужного размера вначале), и я настоятельно рекомендую использовать вектор вместо ручного управления памятью.

В целом, неплохо прокомментировать ваш код, чтобы узнать, где настоящие узкие места, чем микро-оптимизировать фронт (потому что оптимизация не всегда оптимизация).

Ответ 2

Как говорили другие, разработчики языка С++ решили не допускать массивы переменной длины, VLA, несмотря на то, что они доступны на C99. Однако, если вы готовы сделать немного больше работы самостоятельно, и вы просто отчаянно хотите выделить память в стеке, вы можете использовать alloca().

Тем не менее, я лично использовал бы std::vector. Это проще, безопаснее, удобнее и, вероятно, достаточно быстро.

Ответ 3

С++ не допускает массивы переменной длины. Размер должен быть известен во время компиляции. Поэтому вы не можете этого сделать.

Вы можете использовать векторы или new.

vector<int> list;

или

int *list = new int[size];

Если вы поедете с последним, вам нужно освободить его позже:

delete[] list;

быстрее, поэтому я хотел использовать массивы

Это неверно. Откуда вы это слышали?

Ответ 4

В С++ длина массива должна быть известна во время компиляции, чтобы выделить ее в стеке.

Если вам нужно выделить массив, размер которого вы не знаете во время компиляции, вам нужно выделить его в куче, используя operator new[]

int size = menu.size;
int *list = new int[size];

Но поскольку у вас есть новая память в куче, вам нужно убедиться, что вы правильно ее удаляете, когда закончите с ней.

delete[] list;

Ответ 5

в первую очередь, векторы не значительно быстрее. по той причине, почему вы не можете сделать что-то вроде этого:

код будет выделять массив в стеке. компиляторы должны знать этот размер заранее, чтобы они могли его учитывать. поэтому вы можете использовать только константы с этим синтаксисом.

простой способ создания массива в куче: int list = new int[size]; Не забудьте позже delete[]. Однако, если вы используете вектор и сохраняете правильный размер upfront + скомпилировать с оптимизацией, должно быть мало, что абсолютно не накладные расходы.

Ответ 6

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

Ответ 7

Так как в стеке выделяется list, его размер должен быть известен во время компиляции. Но здесь size неизвестно до времени выполнения, поэтому размер list неизвестен во время компиляции.