|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
30.03.2008, 22:27 | #1 |
Форумчанин
Регистрация: 31.05.2007
Сообщений: 486
|
Распределение памяти
Хочу задать вопрос про распределение памяти процедурой SetLength. Меня интересует следующее: при изменении размера ранее созданного динамического массива, теряется ли содержимое его элементов? Я уверен, что если размер массива уменьшается, то данные не теряются - менеджеру кучу проще изменить несколько байт заголовка, чем выполнять реальное перераспределение памяти и "кромсать" кучу. А вот при увеличении размера? Есть ли какие-то твердые гарантии сохранения данных, может быть пояснения от Борланд?
Возможно, это описано и в справочной системе, но я не настолько знаю английский, чтобы прочитать такие тонкости. Тогда может кто-нибудь даст точный перевод? |
30.03.2008, 22:55 | #2 |
*
Старожил
Регистрация: 22.11.2006
Сообщений: 9,201
|
При увеличении - не теряются. На то он и динамический, и длина у него - динамическая. Появилась нужда увеличить количество элементов массива - да ради бога...
А вот насчет того, что вы можете ему длину обрезать и данные не потеряются... Позвольте не согласиться. Это то же самое, как вы от любимого портняжного "сантиметра" вашей жены отрежете кусок и будете убеждать ее, что его длина не изменилась... |
30.03.2008, 23:37 | #3 | ||
Форумчанин
Регистрация: 31.05.2007
Сообщений: 486
|
Цитата:
Цитата:
А вот с увеличением размеров ситуация сложнее. Допустим в куче были последовательно созданы Данные1, Массив и Данные2. Вот как они разместятся: Данные1 - Массив - Данные2 ддддддддмммммммдддддддддд Если массив увеличится в размере, то как менеджер сможет "втиснуть" новые элементы между Массив и Данные2? Ведь элементы массива должны размещаться в памяти непрерывной последовательностью. Если менеджер пересоздаст Массив после Данные2, то получается, что данные массива исчезнут, так? Или происходит копирование старых данных в новое место? Вот этот вопрос я и хочу выяснить. |
||
31.03.2008, 00:27 | #4 |
*
Старожил
Регистрация: 22.11.2006
Сообщений: 9,201
|
Ну, по вопросам "физики процесса" вы можете обратиться на сайт
http://www.borland.com. Я этим вопросом как-то не занимался, ибо для меня он звучит примерно так же, как вопрос о проверке на деревянных счетах результата, полученного от ПК... Ну или, например, как желание увидеть протокол прочностных испытаний ступиц у купленного мной автомобиля. Извините, что не смог помочь. Последний раз редактировалось mihali4; 31.03.2008 в 01:01. |
31.03.2008, 08:42 | #5 | |
Участник клуба
Регистрация: 12.10.2007
Сообщений: 1,204
|
Цитата из справки по setLength:
Цитата:
Если посмотреть реализацию setLength, то можно увидеть, что любое изменение размера приводит к вызову reallocMem. То есть вопрос сводится к работе функции reallocMem при изменении размеров уже выделенного блока. Можно пойти дальше и посмотреть реализацию MemoryManager.reallocMem. Я не стал копаться дальше в исходниках. Считаю, что можно доверить этот вопрос разработчикам компилятора. Последний раз редактировалось alexBlack; 31.03.2008 в 21:10. Причина: Перевод существенной части |
|
31.03.2008, 09:11 | #6 |
Баламучу слегка...
Участник клуба
Регистрация: 01.11.2006
Сообщений: 1,585
|
Насколько я помню при изменении длины массива создается новый, в него копируются данные старого (по мере необходимости), уничтожается старый. Ну да, это ж алгоритм ReallocMem...
|
31.03.2008, 19:59 | #7 |
Форумчанин
Регистрация: 31.05.2007
Сообщений: 486
|
Убедили! Хоть я и не могу прочитать цитату из справки, но, насколько понял из пояснений, там написано что содержимое старого массива все-таки сохраняется.
Огромное всем спасибо! |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
До выделение памяти | MAKTE | Общие вопросы C/C++ | 4 | 20.05.2008 21:34 |
генератор псевдослучайных чисел - распределение | elsin | Общие вопросы Delphi | 12 | 15.05.2008 16:07 |
Выделение памяти | antoha.by | Паскаль, Turbo Pascal, PascalABC.NET | 2 | 29.04.2008 20:04 |
игры для памяти | Exclusive | Свободное общение | 4 | 30.01.2008 23:06 |
Кол-во оперативной памяти | Квэнди | Win Api | 2 | 25.07.2007 13:27 |