
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[216.73.216.52] |
![]() |
|
Сообщ.
#1
,
|
|
|
использую new для создания больших массивов. удаляю - delete. Но если массивы приходиться создавать и удалять в цикле очень много раз - не будет ли доступная память фрагментирована? Если будет - то как ее дефрагментировать.
|
Сообщ.
#2
,
|
|
|
определить свои new и delete в стиле Aren
|
Сообщ.
#3
,
|
|
|
Gамять-то виртуальная. Cтраничками по 4k выдается. Gоди, определи физический адрес и разберись - фрагментирована она или нет. Может быть она изначально фрагментирована
![]() |
Сообщ.
#4
,
|
|
|
Физическая память не важна. Рассматриватися хип.
Чаще всего используются списки для памяти. И при освобождении памяти, если соседи свободны их границы примыкают к освобождаемому элементу, они должны объединяться - при освобождении дефрагментируется. И не уверен, что при освобождении достаточного размера кучи, будет освобождаться виртуальная память (общий размер доступной хипу памяти уменьшаться). Вобщем все зависит только от того какие массивы создаются, одинакого ли размера и т.п. |
Сообщ.
#5
,
|
|
|
for rcz
если хватает оперативки то можно спать спокойно? а если нет? дефрагментирует ли операционка виртуальную память? или существует ли в си такая функция, чтобы при определенном количестве итераций цикла с созданием и удалением массивов дефрагментировать принудительно. Массивы здоровые по несколько мегабайт, создание и удаление их может происходить сотни или даже тысячи раз. Каждый раз размер массива разный. В дельфях я об этом не задумывался, а щас переписываю на Си и чего-то озаботился.. |
Сообщ.
#6
,
|
|
|
В C отдельной функции дефрагментации памяти нет.
Насчет Buildera не знаю. Хотя не думаю, что Borland изобретали заново велосипед - они скорее всего оставили делфевый аллокатор. Если используешь VC в CRT есть исходники динамической памяти - new и delete (malloc и free). Может плохо смотрел, но так и не нашел дефрагментации. Немного оно основано на HeapFree (как реализовано в виндах точно не знаю). Но скорее всего это что-то вроде такой структуры prev_size, flags, block_size, next_free, size.... далее выделяемая память. При освобождении блока block смотрится блок &block - block.prev_size-sizeof(block). Если оно свободно, то сливаются, аналогично смотрится и следующий. Простейшая дефрагментация при освобождении. Ну и можно ведь определить свой аллокатор. Учитывая специфику задачи - выделение больших массивов, более 1 страницы (4кб). Выделять постранично, и освобождать (использовать VirtualAlloc/VirtualFree). И не надо будет задумываться о дефрагментации. |
Сообщ.
#7
,
|
|
|
Дефрагментация на уровне системы не возможна, потому как при дефрагментации необходимо перемещать данные. Система просто ищет первый подходящий по размеру кусок. Дефрагментацию тебе нужно делать самому.
|
Сообщ.
#8
,
|
|
|
.... с исправлением всех указателей на перемещаемые данные.
|
Сообщ.
#9
,
|
|
|
A Memory Allocator by Doug Lea - http://www.nondot.org/sabre/os/files/MemManagement/LEA.html
|