Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
[Win32] Критические замечания... 16.06.01 22:36 Число просмотров: 929
Автор: Sandy <Alexander Stepanov> Статус: Elderman
|
Связанные списки не подходят даже не по этой причине. При расширении списка надо выделять память под новый элемент, а этого делать нельзя по условиям задачи (new делать запрещено). Значит память под элементы списка должна выделяться при инициализации менеджера, т.е. создается таблица в памяти, где содержится вся инфа о куче. И уже в этой таблице создаются/изменяются/удаляются элементы, которые описывают блоки памяти. Кстати, из-за того, что размер элемента таблицы фиксированная величина, можно попробовать поиск/удаление/изм
Что касается "сборки мусора", то эта проблема достаточно серьезная, в Винде этим занимается специальный поток с приоритетом Idle, в момент простоя системы он просматривает описатели кучи и сливает незанятые участки памяти в один большой кусок. Но винде проще, так как ей достаточно поменять базовые адреса в GDT, а вот тебе так сделать не удастся :( Отдельным потоком это сделано именно по описанным тобой причинам: гораздо быстрее выделить блок памяти в новой странице и потом неспеша в момент простоя собрать эти блоки в одну кучу, чем искать подходящий по размеру блок в уже фрагментированной куче во время выполнения приложения.
Здесь звучало предложение о виртуальных указателях - тоже не пойдет. Приложение, получив от менеджера виртуальный указатель на выделенный блок памяти, наверняка захочет с этим указателем что-нибудь сделать - записать в эту память данные или что-то в этом роде. Аппликация, скорее всего, слетит с ошибкой "Access violation" по вполне понятным причинам.
Возможно, есть еще какие-нибудь "нельзя", но и здесь почва для больших размышлений.
|
|
|