Такого алгоритма не существует, поскольку после его применения станут невалидными все указатели.
Можно юзать вместо указателей какие-нибудь хендлы блоков памяти.
Чтобы получить указатель, надо будет зафиксировать блок (имея его хендл), а после его модификации - освободить, чтобы менеджер кучи имел возможность его перемещать и упаковывать.
Но для этого надо написать свой менеджер кучи.
дефрагментация памяти на си
Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain
- Romeo
- Сообщения: 3126
- Зарегистрирован: 02 мар 2004, 17:25
- Откуда: Крым, Севастополь
- Контактная информация:
И вообще программиста такие вещи не должны заботить. Дефрагментацию памяти проводит Windows.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
В принципе с памятью можно побаловаться, но у меня такое получалось только при помощи ассемблера. Причет прога была под Дос, т.е. писалась на Си с Асм. функциями(вставками)... Тогда я классно поизвращался со всё этой фигнёй...
Усложнять - легко, упрощать - сложно
- Romeo
- Сообщения: 3126
- Зарегистрирован: 02 мар 2004, 17:25
- Откуда: Крым, Севастополь
- Контактная информация:
Одно дело играться с памятью, другое дело дефрагментировать память. Если ты её просто так дефрагметируешь, то ысе ссылки станут невалидными.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
значит нужно при перемещении элемента изменять соответствующие ссылки, т.е сначала удалять элемент а затем размещать на него память в другом месте, но возникает проблема где сохранять содержимое блока если вся память заполнена? Может использовать файл-буфер или стек сделать(?)? Как переместить блок без предварительного удаления старого указателя я не знаю. Подскажите может кто нибудь с таким сталкивался!!!
Блин, ясен пень, что при таком подходе нчего хорошего не светитRomeo писал(а):Одно дело играться с памятью, другое дело дефрагментировать память. Если ты её просто так дефрагметируешь, то ысе ссылки станут невалидными.

Сожно следать свою мапу, где по внутренним хендлам хранить реальные указатели на память. Прога будет работать только с хендлами а раельные указатели уже твой менеджер будет крутить как хочет. Но всеравно программа должна знать, что она работает с хендлами а не с прямыми указателями. Без этого ни как.