Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Массивы


Автор: Kirill_2004_dcs 10.4.2004, 22:57
Чем отличается динамическое распределение памяти от статического для массивов? И как это выглядит на практике..?
Cпасибо.

Автор: Stalk 10.4.2004, 23:11
Статическое: эта переменная всю свою жизнь будет иметь размер который ты ей определил
Динамическое: в любом месте проги ты можешь изменить размеры массива

Автор: oleg1973 11.4.2004, 03:25
на практике вглядит забавней
если массив вдруг изменил свой размер то ось быстренько меняет размер выделеной памяти под него
и если вдруг памяти чета не хватит то сбросит в своп что имхо тормозно

Автор: Guest 11.4.2004, 08:24
А еще статический массив постоянно сидит в памяти, а динамический массив жрет память когда это надо. И большие массивы обычно должны быть динамическими. smile.gif

Автор: sergeeff 11.4.2004, 18:07
Популярно объясняю.
Статически память под массив выделяется при его объявлении вне какой-ли функции. Тогда компилятор резервирует место под массив в сегменте данных DATA. На этапе линковки объединяются все одноименные сегменты программных модулей.

Если ты объявляешь массив внутри функции - то место выделяется в сегменте данных STACK. Соответственно данные в таком массиве сохраняются и доступны только в самой этой функции и в нижлежащих функциях (т.е. тех, которые вызываются из этой функции), если ты им укажешь адрес этого массива.

Динамически память выделяется в особом разделе памяти, обычно именуемом "куча" (HEAP). Размер "кучи" - это вопрос не компилятора, а реализации "кучи" в библиотеке. Ну и называется она динамической именно потому, что размер памяти выделяется под массив не на этапе компиляции, а непосредственно на этапе выполнения.

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

Для обычного С массива это совершенно не так! OS ничего быстренько ему не меняет.

Автор: oleg1973 11.4.2004, 18:38
sergeeff
ну ну ну
спокойнее плиз smile.gif
для выделеня памяти есть минимум 2 метода
1) неинициалицированые данные в сегменте
2) функ типа GlobalAlloc

при статическом массиве может использоватся 1 способ, как менее трудоемкий
при динамическом он не прокатит и прога будет использовать GlobalAlloc
и если она не тупа то с GMEM_FIXED что дает нам выделение памяти в "несвопабельном" куске smile.gif
и при увеличении размера массива прога должна будет сделать GlobalReAlloc с указанием нового размера

Автор: sergeeff 12.4.2004, 00:52
Все это красивые термины, на самом деле затуманивающие истинный смысл.

Либо статическое выделение, либо динамическое.
Статическое неинициализированное в одном сегменте памяти, инициализированное - в другом.

А то как уж реализована куча, так это на совести известных ребят из Калифорнии.

Вот и вся наука.

Автор: oleg1973 12.4.2004, 01:28
хосподи причем тут куча?

Автор: sergeeff 12.4.2004, 13:40
Почитаем, например, http://www.osp.ru/pcworld/1998/06/180.htm:

Кучи (heaps) - это динамически распределяемые области данных. При порождении процесса ему предоставляется куча размером 1 Мбайт по умолчанию. Ее размер может изменяться параметром /HEAP при построении исполняемого модуля. Функции библиотеки времени исполнения компилятора (malloc(), free() и т. д.) используют возможности куч.


Автор: oleg1973 14.4.2004, 00:35
1) памятью заведует операционка
2) если командир не прав смотри пункт первый

пусть даже оно там в стеке массивится
но при изменении размера с 1 до 5 мег че по чтвоему будет?
будет обрашение к оси за памятью

Автор: sergeeff 14.4.2004, 23:02
Уважаемый oleg1973!

Вернемся к истории вопроса. Наш коллега задал вопрос про отличия статической и динамической памяти. Он что-то спрашивал, про то, как это реализовано в Windows? Нет.

Все твои последние мне возражения - это нюансы реализации. Мир не замыкается только на Windows. Существуют сотни других различных OC, в которых успешно работают компиляторы C/C++, не говоря уже про различные embedded приложения, где может вообще никакой операционной системы не быть. Но абсолютно везде существует статическое выделение памяти. А вот динамическая память - это вопрос реализации. Может быть, а может и нет.

Считаю на том вопрос исчерпанным.

С почтением

Автор: oleg1973 16.4.2004, 18:37
sergeeff
отмазался smile.gif

Автор: FreshMeat 16.4.2004, 18:47
Цитата(Kirill_2004_dcs @ 10.4.2004, 22:57)
Чем отличается динамическое распределение памяти от статического для массивов? И как это выглядит на практике..?

Топаем сюда и читаем умные буки
http://anatolix.naumen.ru/cppbooks.htm
Для начинающих рекомендуют Липпмана

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)