Статический массив против динамического массива в C ++ - PullRequest
75 голосов
/ 20 апреля 2010

В чем разница между статическим массивом и динамическим массивом в C ++?

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

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

Можете ли вы объяснить разницу между статическим массивом и динамическим массивом в C ++?

Ответы [ 10 ]

84 голосов
/ 20 апреля 2010

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

int foo[10];

Массивы, созданные с помощью operator new[], имеют динамическую длительность хранения и хранятся в куче (технически «свободный магазин»). Они могут иметь любой размер, но вам нужно выделить и освободить их самостоятельно, поскольку они не являются частью фрейма стека:

int* foo = new int[10];
delete[] foo;
27 голосов
/ 23 июля 2013

static - это ключевое слово в C и C ++, поэтому вместо общего описательного термина static имеет очень специфическое значение применительно к переменной или массиву. Чтобы составить путаницу, она имеет три различных значения в разных контекстах. Из-за этого статический массив может быть фиксированным или динамическим.

Позвольте мне объяснить:

Первый относится к C ++:

  • Статический член класса - это значение, которое не создается с помощью конструктора или удаляется с помощью деструктора. Это означает, что элемент должен быть инициализирован и поддерживаться другим способом. Статический член может быть указателями, инициализированными нулем, а затем размещен при первом вызове конструктора. (Да, это было бы статично и динамично)

Два наследуются от C:

  • внутри функции статическая переменная - это переменная, чья память сохраняется между вызовами функций. Он является статическим в том смысле, что он инициализируется только один раз и сохраняет свое значение между вызовами функций (использование статики делает функцию не реентерабельной, т. Е. Не потокобезопасной)

  • статические переменные, объявленные вне функций, являются глобальными переменными, доступ к которым возможен только из одного и того же модуля (файл исходного кода с любым другим # include)

Вопрос (я думаю), который вы хотели задать, заключается в том, в чем разница между динамическими массивами и массивами фиксированной или компиляции. Это более простой вопрос, массивы времени компиляции определяются заранее (когда программа компилируется) и являются частью фрейма стека функций. Они распределяются до запуска основной функции. динамические массивы выделяются во время выполнения с помощью ключевого слова «new» (или семейства malloc из C), а их размер заранее неизвестен. динамические выделения не очищаются автоматически до тех пор, пока программа не прекратит работу.

11 голосов
/ 20 апреля 2010

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

int x[10];

, а "динамическим" будет просто структура любого типа, которая позволяет увеличить или уменьшить базовое хранилище во время выполнения. В большинстве случаев достаточно класса std::vector из стандартной библиотеки C ++. Используйте это так:

std::vector<int> x(10); // this starts with 10 elements, but the vector can be resized.

std::vector имеет operator[], поэтому вы можете использовать его с той же семантикой, что и у массива.

8 голосов
/ 20 октября 2014

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

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

int x[10]; //static array with global scope
static int y[10]; //static array with file scope
foo() {
    static int z[10]; //static array with local scope

Автоматические переменные обычно реализуются с использованием выделения памяти на основе стека . Автоматический массив может быть создан в C / C ++ следующим образом:

foo() {
    int w[10]; //automatic array

Общим для этих массивов x, y, z и w является то, что размер каждого из них фиксирован и определяется во время компиляции.

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

Под динамическим массивом обычно подразумевается , размер которого не изменяется, а реализуется с использованием динамического выделения памяти с фиксированным размером, определяемым во время выполнения. В C ++ это делается с помощью оператора new .

foo() {
   int *d = new int[n]; //dynamically allocated array with size n     

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

foo() {
    int *s = (int*)alloca(n*sizeof(int))

Для настоящего динамического массива следует использовать что-то вроде std::vector в C ++ (или массив переменной длины в C ).

Что означало назначение в вопросе ОП? Я думаю, ясно, что требовался не статический или автоматический массив, а тот, который использовал динамическое выделение памяти с использованием оператора new или массив нефиксированного размера, например, с помощью. std::vector.

8 голосов
/ 20 апреля 2010

Статические массивы выделяются памяти во время компиляции, а память выделяется в стеке. Принимая во внимание, что динамические массивы выделяются памяти во время выполнения, а память выделяется из кучи.

int arr[] = { 1, 3, 4 }; // static integer array.   
int* arr = new int[3]; // dynamic integer array.
3 голосов
/ 20 апреля 2010

Я думаю, что в этом контексте это означает, что это статично в том смысле, что размер является фиксированным. Используйте std :: vector. Имеет функцию resize ().

1 голос
/ 17 октября 2014

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

int size;
cin >> size;
int dynamicArray[size];
0 голосов
/ 17 декабря 2013

Статический массив: эффективность. Не требуется динамическое распределение или освобождение.

Массивы, объявленные в C, C ++ в функции, включая статический модификатор, являются статическими. Пример: static int foo [5];

0 голосов
/ 27 февраля 2013

Да, верно, статический массив создается во время компиляции, где динамический массив создается во время выполнения. В то время как различие в том, что касается их областей памяти, статические находятся в стеке, а динамические создаются в куче. Все, что находится в куче, требует управления памятью до тех пор, пока не будет создан сборщик мусора, как в случае .net framework, в противном случае существует риск утечки памяти.

0 голосов
/ 27 февраля 2013

статические арены с подачей на элементы в боковом массиве

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

пример:

     char a[10]; //static array
       char a[];  //dynamic array
...