дефрагментация памяти на си

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Ответить
Absurd
Сообщения: 1228
Зарегистрирован: 26 фев 2004, 13:24
Откуда: Pietari, Venäjä
Контактная информация:

Такого алгоритма не существует, поскольку после его применения станут невалидными все указатели.
Можно юзать вместо указателей какие-нибудь хендлы блоков памяти.
Чтобы получить указатель, надо будет зафиксировать блок (имея его хендл), а после его модификации - освободить, чтобы менеджер кучи имел возможность его перемещать и упаковывать.
Но для этого надо написать свой менеджер кучи.
2B OR NOT(2B) = FF
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

И вообще программиста такие вещи не должны заботить. Дефрагментацию памяти проводит Windows.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Hup
Сообщения: 207
Зарегистрирован: 05 мар 2004, 05:31
Откуда: Владивосток
Контактная информация:

В принципе с памятью можно побаловаться, но у меня такое получалось только при помощи ассемблера. Причет прога была под Дос, т.е. писалась на Си с Асм. функциями(вставками)... Тогда я классно поизвращался со всё этой фигнёй...
Усложнять - легко, упрощать - сложно
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Одно дело играться с памятью, другое дело дефрагментировать память. Если ты её просто так дефрагметируешь, то ысе ссылки станут невалидными.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
crack
Сообщения: 8
Зарегистрирован: 29 апр 2004, 00:14
Откуда: Санкт-Петербург

значит нужно при перемещении элемента изменять соответствующие ссылки, т.е сначала удалять элемент а затем размещать на него память в другом месте, но возникает проблема где сохранять содержимое блока если вся память заполнена? Может использовать файл-буфер или стек сделать(?)? Как переместить блок без предварительного удаления старого указателя я не знаю. Подскажите может кто нибудь с таким сталкивался!!!
Hup
Сообщения: 207
Зарегистрирован: 05 мар 2004, 05:31
Откуда: Владивосток
Контактная информация:

Romeo писал(а):Одно дело играться с памятью, другое дело дефрагментировать память. Если ты её просто так дефрагметируешь, то ысе ссылки станут невалидными.
Блин, ясен пень, что при таком подходе нчего хорошего не светит :D
Hawk
Сообщения: 216
Зарегистрирован: 17 фев 2004, 14:52
Откуда: СПб
Контактная информация:

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