Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 30.03.2008, 22:27   #1
Jeni
Форумчанин
 
Регистрация: 31.05.2007
Сообщений: 486
По умолчанию Распределение памяти

Хочу задать вопрос про распределение памяти процедурой SetLength. Меня интересует следующее: при изменении размера ранее созданного динамического массива, теряется ли содержимое его элементов? Я уверен, что если размер массива уменьшается, то данные не теряются - менеджеру кучу проще изменить несколько байт заголовка, чем выполнять реальное перераспределение памяти и "кромсать" кучу. А вот при увеличении размера? Есть ли какие-то твердые гарантии сохранения данных, может быть пояснения от Борланд?

Возможно, это описано и в справочной системе, но я не настолько знаю английский, чтобы прочитать такие тонкости. Тогда может кто-нибудь даст точный перевод?
Jeni вне форума Ответить с цитированием
Старый 30.03.2008, 22:55   #2
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

При увеличении - не теряются. На то он и динамический, и длина у него - динамическая. Появилась нужда увеличить количество элементов массива - да ради бога...
А вот насчет того, что вы можете ему длину обрезать и данные не потеряются... Позвольте не согласиться.
Это то же самое, как вы от любимого портняжного "сантиметра" вашей жены отрежете кусок и будете убеждать ее, что его длина не изменилась...
mihali4 вне форума Ответить с цитированием
Старый 30.03.2008, 23:37   #3
Jeni
Форумчанин
 
Регистрация: 31.05.2007
Сообщений: 486
По умолчанию

Цитата:
Сообщение от mihali4 Посмотреть сообщение
При увеличении - не теряются. На то он и динамический, и длина у него - динамическая. Появилась нужда увеличить количество элементов массива - да ради бога...
Скажите, а есть где-нибудь "официальное" подтверждение этого? Просто я делаю программу, где ошибиться в этом пункте будет недопустимым. Можно конечно перед изменением размера делать временный массив, запоминать в него существующие данные, а затем, после увеличения размера - восстановить данные. Вот только массивы будут очень большие и такой вариант не подходит.

Цитата:
Сообщение от mihali4 Посмотреть сообщение
А вот насчет того, что вы можете ему длину обрезать и данные не потеряются... Позвольте не согласиться.
Это мне совершенно непонятно - чтобы уменьшить длину массива, достаточно просто изменить несколько байт его заголовка, полагаю, именно так менеджер кучи и поступает - в таком случае никакие данные потеряться не могут (это все-равно как в строке типа ShortString уменьшить значение нулевого байта - первые символы никуда не денутся).
А вот с увеличением размеров ситуация сложнее. Допустим в куче были последовательно созданы Данные1, Массив и Данные2. Вот как они разместятся:
Данные1 - Массив - Данные2
ддддддддмммммммдддддддддд

Если массив увеличится в размере, то как менеджер сможет "втиснуть" новые элементы между Массив и Данные2? Ведь элементы массива должны размещаться в памяти непрерывной последовательностью. Если менеджер пересоздаст Массив после Данные2, то получается, что данные массива исчезнут, так? Или происходит копирование старых данных в новое место?
Вот этот вопрос я и хочу выяснить.
Jeni вне форума Ответить с цитированием
Старый 31.03.2008, 00:27   #4
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Ну, по вопросам "физики процесса" вы можете обратиться на сайт
http://www.borland.com.
Я этим вопросом как-то не занимался, ибо для меня он звучит примерно так же, как вопрос о проверке на деревянных счетах результата, полученного от ПК...
Ну или, например, как желание увидеть протокол прочностных испытаний ступиц у купленного мной автомобиля.
Извините, что не смог помочь.

Последний раз редактировалось mihali4; 31.03.2008 в 01:01.
mihali4 вне форума Ответить с цитированием
Старый 31.03.2008, 08:42   #5
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

Цитата:
Сообщение от Jeni Посмотреть сообщение
Скажите, а есть где-нибудь "официальное" подтверждение этого?
Цитата из справки по setLength:

Цитата:
For a long-string or dynamic-array variable, SetLength reallocates the string or array referenced by S to the given length. Existing characters in the string or elements in the array are preserved, but the content of newly allocated space is undefined. (Существующие символы строки или элементы массива сохраняются, но вновь распределенные элементы неопределены.)
Можно это считать официальным подтверждением ?

Если посмотреть реализацию setLength, то можно увидеть, что любое изменение размера приводит к вызову reallocMem. То есть вопрос сводится к работе функции reallocMem при изменении размеров уже выделенного блока. Можно пойти дальше и посмотреть реализацию MemoryManager.reallocMem. Я не стал копаться дальше в исходниках. Считаю, что можно доверить этот вопрос разработчикам компилятора.

Последний раз редактировалось alexBlack; 31.03.2008 в 21:10. Причина: Перевод существенной части
alexBlack вне форума Ответить с цитированием
Старый 31.03.2008, 09:11   #6
Баламут
Баламучу слегка...
Участник клуба
 
Аватар для Баламут
 
Регистрация: 01.11.2006
Сообщений: 1,585
По умолчанию

Насколько я помню при изменении длины массива создается новый, в него копируются данные старого (по мере необходимости), уничтожается старый. Ну да, это ж алгоритм ReallocMem...
Баламут вне форума Ответить с цитированием
Старый 31.03.2008, 19:59   #7
Jeni
Форумчанин
 
Регистрация: 31.05.2007
Сообщений: 486
По умолчанию

Убедили! Хоть я и не могу прочитать цитату из справки, но, насколько понял из пояснений, там написано что содержимое старого массива все-таки сохраняется.
Огромное всем спасибо!
Jeni вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
До выделение памяти 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