![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
Kirill_2004_dcs |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 51 Регистрация: 10.4.2004 Репутация: нет Всего: нет |
Чем отличается динамическое распределение памяти от статического для массивов? И как это выглядит на практике..?
Cпасибо. |
|||
|
||||
Stalk |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 73 Регистрация: 24.1.2004 Где: Украина, харьков Репутация: нет Всего: нет |
Статическое: эта переменная всю свою жизнь будет иметь размер который ты ей определил
Динамическое: в любом месте проги ты можешь изменить размеры массива |
|||
|
||||
oleg1973 |
|
|||
![]() asm fanat ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 3283 Регистрация: 16.7.2003 Где: Italy Репутация: 1 Всего: 34 |
на практике вглядит забавней
если массив вдруг изменил свой размер то ось быстренько меняет размер выделеной памяти под него и если вдруг памяти чета не хватит то сбросит в своп что имхо тормозно -------------------- SST 465555 icq 200-512-712 |
|||
|
||||
Guest |
|
|||
Unregistered |
А еще статический массив постоянно сидит в памяти, а динамический массив жрет память когда это надо. И большие массивы обычно должны быть динамическими.
![]() |
|||
|
||||
sergeeff |
|
|||
Новичок Профиль Группа: Участник Сообщений: 46 Регистрация: 19.5.2002 Репутация: нет Всего: нет |
Популярно объясняю.
Статически память под массив выделяется при его объявлении вне какой-ли функции. Тогда компилятор резервирует место под массив в сегменте данных DATA. На этапе линковки объединяются все одноименные сегменты программных модулей. Если ты объявляешь массив внутри функции - то место выделяется в сегменте данных STACK. Соответственно данные в таком массиве сохраняются и доступны только в самой этой функции и в нижлежащих функциях (т.е. тех, которые вызываются из этой функции), если ты им укажешь адрес этого массива. Динамически память выделяется в особом разделе памяти, обычно именуемом "куча" (HEAP). Размер "кучи" - это вопрос не компилятора, а реализации "кучи" в библиотеке. Ну и называется она динамической именно потому, что размер памяти выделяется под массив не на этапе компиляции, а непосредственно на этапе выполнения.
Для обычного С массива это совершенно не так! OS ничего быстренько ему не меняет. |
|||
|
||||
oleg1973 |
|
|||
![]() asm fanat ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 3283 Регистрация: 16.7.2003 Где: Italy Репутация: 1 Всего: 34 |
sergeeff
ну ну ну спокойнее плиз ![]() для выделеня памяти есть минимум 2 метода 1) неинициалицированые данные в сегменте 2) функ типа GlobalAlloc при статическом массиве может использоватся 1 способ, как менее трудоемкий при динамическом он не прокатит и прога будет использовать GlobalAlloc и если она не тупа то с GMEM_FIXED что дает нам выделение памяти в "несвопабельном" куске ![]() и при увеличении размера массива прога должна будет сделать GlobalReAlloc с указанием нового размера -------------------- SST 465555 icq 200-512-712 |
|||
|
||||
sergeeff |
|
|||
Новичок Профиль Группа: Участник Сообщений: 46 Регистрация: 19.5.2002 Репутация: нет Всего: нет |
Все это красивые термины, на самом деле затуманивающие истинный смысл.
Либо статическое выделение, либо динамическое. Статическое неинициализированное в одном сегменте памяти, инициализированное - в другом. А то как уж реализована куча, так это на совести известных ребят из Калифорнии. Вот и вся наука. |
|||
|
||||
oleg1973 |
|
|||
![]() asm fanat ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 3283 Регистрация: 16.7.2003 Где: Italy Репутация: 1 Всего: 34 |
хосподи причем тут куча?
-------------------- SST 465555 icq 200-512-712 |
|||
|
||||
sergeeff |
|
|||
Новичок Профиль Группа: Участник Сообщений: 46 Регистрация: 19.5.2002 Репутация: нет Всего: нет |
Почитаем, например, http://www.osp.ru/pcworld/1998/06/180.htm:
Кучи (heaps) - это динамически распределяемые области данных. При порождении процесса ему предоставляется куча размером 1 Мбайт по умолчанию. Ее размер может изменяться параметром /HEAP при построении исполняемого модуля. Функции библиотеки времени исполнения компилятора (malloc(), free() и т. д.) используют возможности куч. |
|||
|
||||
oleg1973 |
|
|||
![]() asm fanat ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 3283 Регистрация: 16.7.2003 Где: Italy Репутация: 1 Всего: 34 |
1) памятью заведует операционка
2) если командир не прав смотри пункт первый пусть даже оно там в стеке массивится но при изменении размера с 1 до 5 мег че по чтвоему будет? будет обрашение к оси за памятью -------------------- SST 465555 icq 200-512-712 |
|||
|
||||
sergeeff |
|
|||
Новичок Профиль Группа: Участник Сообщений: 46 Регистрация: 19.5.2002 Репутация: нет Всего: нет |
Уважаемый oleg1973!
Вернемся к истории вопроса. Наш коллега задал вопрос про отличия статической и динамической памяти. Он что-то спрашивал, про то, как это реализовано в Windows? Нет. Все твои последние мне возражения - это нюансы реализации. Мир не замыкается только на Windows. Существуют сотни других различных OC, в которых успешно работают компиляторы C/C++, не говоря уже про различные embedded приложения, где может вообще никакой операционной системы не быть. Но абсолютно везде существует статическое выделение памяти. А вот динамическая память - это вопрос реализации. Может быть, а может и нет. Считаю на том вопрос исчерпанным. С почтением |
|||
|
||||
oleg1973 |
|
|||
![]() asm fanat ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 3283 Регистрация: 16.7.2003 Где: Italy Репутация: 1 Всего: 34 |
sergeeff
отмазался ![]() -------------------- SST 465555 icq 200-512-712 |
|||
|
||||
FreshMeat |
|
|||
Новичок Профиль Группа: Участник Сообщений: 37 Регистрация: 30.1.2004 Репутация: нет Всего: нет |
Топаем сюда и читаем умные буки http://anatolix.naumen.ru/cppbooks.htm Для начинающих рекомендуют Липпмана |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |