На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: Qraizer, Hsilgos
  
> фрагентация памяти
    использую new для создания больших массивов. удаляю - delete. Но если массивы приходиться создавать и удалять в цикле очень много раз - не будет ли доступная память фрагментирована? Если будет - то как ее дефрагментировать.
      определить свои new и delete в стиле Aren
        Gамять-то виртуальная. Cтраничками по 4k выдается. Gоди, определи физический адрес и разберись - фрагментирована она или нет. Может быть она изначально фрагментирована smile.gif
          Физическая память не важна. Рассматриватися хип.

          Чаще всего используются списки для памяти. И при освобождении памяти, если соседи свободны их границы примыкают к освобождаемому элементу, они должны объединяться - при освобождении дефрагментируется. И не уверен, что при освобождении достаточного размера кучи, будет освобождаться виртуальная память (общий размер доступной хипу памяти уменьшаться).

          Вобщем все зависит только от того какие массивы создаются, одинакого ли размера и т.п.
          Сообщение отредактировано: rcz -
            for rcz
            если хватает оперативки то можно спать спокойно?
            а если нет? дефрагментирует ли операционка виртуальную память? или существует ли в си такая функция, чтобы при определенном количестве итераций цикла с созданием и удалением массивов
            дефрагментировать принудительно. Массивы здоровые по несколько мегабайт, создание и удаление их может происходить сотни или даже тысячи раз. Каждый раз размер массива разный.
            В дельфях я об этом не задумывался, а щас переписываю на Си и чего-то озаботился..
              В 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). И не надо будет задумываться о дефрагментации.
              Сообщение отредактировано: rcz -
                Дефрагментация на уровне системы не возможна, потому как при дефрагментации необходимо перемещать данные. Система просто ищет первый подходящий по размеру кусок. Дефрагментацию тебе нужно делать самому.
                  .... с исправлением всех указателей на перемещаемые данные.
                    1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                    0 пользователей:


                    Рейтинг@Mail.ru
                    [ Script execution time: 0,0250 ]   [ 15 queries used ]   [ Generated: 8.07.25, 13:51 GMT ]