Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > 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 |
А еще статический массив постоянно сидит в памяти, а динамический массив жрет память когда это надо. И большие массивы обычно должны быть динамическими. ![]() |
Автор: sergeeff 11.4.2004, 18:07 | ||
Популярно объясняю. Статически память под массив выделяется при его объявлении вне какой-ли функции. Тогда компилятор резервирует место под массив в сегменте данных DATA. На этапе линковки объединяются все одноименные сегменты программных модулей. Если ты объявляешь массив внутри функции - то место выделяется в сегменте данных STACK. Соответственно данные в таком массиве сохраняются и доступны только в самой этой функции и в нижлежащих функциях (т.е. тех, которые вызываются из этой функции), если ты им укажешь адрес этого массива. Динамически память выделяется в особом разделе памяти, обычно именуемом "куча" (HEAP). Размер "кучи" - это вопрос не компилятора, а реализации "кучи" в библиотеке. Ну и называется она динамической именно потому, что размер памяти выделяется под массив не на этапе компиляции, а непосредственно на этапе выполнения.
Для обычного С массива это совершенно не так! OS ничего быстренько ему не меняет. |
Автор: oleg1973 11.4.2004, 18:38 |
sergeeff ну ну ну спокойнее плиз ![]() для выделеня памяти есть минимум 2 метода 1) неинициалицированые данные в сегменте 2) функ типа GlobalAlloc при статическом массиве может использоватся 1 способ, как менее трудоемкий при динамическом он не прокатит и прога будет использовать GlobalAlloc и если она не тупа то с GMEM_FIXED что дает нам выделение памяти в "несвопабельном" куске ![]() и при увеличении размера массива прога должна будет сделать 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 отмазался ![]() |
Автор: FreshMeat 16.4.2004, 18:47 | ||
Топаем сюда и читаем умные буки http://anatolix.naumen.ru/cppbooks.htm Для начинающих рекомендуют Липпмана |