Разница между статическим и динамическим связыванием массива - PullRequest
4 голосов
/ 21 ноября 2011

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

Вопрос

1.) Из того, что я знаю, статическое связывание означает, что оно установлено во время компиляции, и оно существует во время выполнения, тогда как для динамического связывания означает, что оно установлено во время выполнения.

2.) Так чтоВ книге, которую я читаю, рассказывается о динамическом массиве. В нем упоминается, что размер динамического массива может быть установлен во время выполнения. Что делается таким образом.

Код

int size;
cin >> size;
int * pz = new int [size]; // dynamic binding, size set at run time
delete [] pz; // free memory when finished

3.) В этом коде книга может указывать динамический размер массива во время выполнения. Из любопытства я попробую это.

Код

int size;
cin >> size;
int array[size];
//After the array declaraction i assign value to it to check whether it works or not.

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

5.) Это из-за динамического массивамог освободить свою память во время выполнения, тогда как статическая не может, вот что делает его таким особенным ??

Спасибо, что потратили время на чтение моего вопроса, укажите на любую ошибку, сделанную мной.

Ответы [ 3 ]

6 голосов
/ 21 ноября 2011

Ваш статический массив с динамическим размером (называемый массив переменной длины, короткий VLA) работает только благодаря расширению языка в вашем компиляторе. Это вещь C99, которая не содержится в стандарте C ++, что означает, что она не будет переносимой.

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

2 голосов
/ 21 ноября 2011
int size;
int array[size];

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

Вы объявляете массивы, подобные этим

int array[5]

или

const int size = 100;
int array[size];

когда вы заранее знаете размер массива.

В противном случае вы используете новый и delete [] подход. Я бы рекомендовал вообще избегать этой конструкции в пользу std :: vector

1 голос
/ 05 октября 2012

раннее связывание: - Язык, на котором большинство переводов делается во время перевода, в начале обработки программы считается ранним связыванием.
Позднее связывание: - язык с задержкой позднего связывания наиболее связывает до l времени выполнения.

раннее связывание: - Менее гибко.
Позднее связывание: - Имеет большую гибкость программирования.

раннее связывание: - В эти данные принимаются только в объявленном типе данных
Позднее связывание: - В эту переменную можно принять любой тип данных.

раннее связывание: - Обнаружено в правильном типе назначения.
Позднее связывание: - В этом неправильном типе правой стороны присвоения не обнаружено или ошибка.

раннее связывание: - Проверка типа должна выполняться во время компиляции.
Позднее связывание: - Проверка типа должна выполняться во время выполнения.

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

...