как использовать boost.pool для реализации карты, такой как карта STL - PullRequest
3 голосов
/ 09 февраля 2012

В начале я использую std :: map, но мне нужно заставить карту освободить память.Я использую карту только один раз и выделил большую память.Карта возвращает память только в кучу, а не в ОС, поэтому она все еще существует.

После некоторого Google я нашел boost.pool, но у меня нет четкого представления о том, как реализовать карту, используя ее, спасибо!

Ответы [ 2 ]

0 голосов
/ 09 февраля 2012

Что если вы напишите собственный распределитель и передадите его на карту.Ваш локатор может использовать malloc и бесплатно.Я почти уверен, что это на уровне ОС.

Ваш класс распределителя должен реализовывать только методы, показанные здесь: http://www.cplusplus.com/reference/std/memory/allocator/

Затем, когда вы определите свой std :: map .. passкласс распределителя в качестве третьего аргумента шаблона: http://www.cplusplus.com/reference/stl/map/

например:

std::map<KeyType, ValueType, less<KeyType>, MyAllocator> 

Эта ссылка из этой книги также содержит пример кода для создания собственного распределителя: http://www.josuttis.com/libbook/memory/myalloc.hpp.html

Предупреждение: Я думаю, что причина в том, что большинство распределителей не отдают память ОС, заключается в том, что быстрее удерживать ее на потом, чем возвращать ОС и получать больше каждый раз;так что вы можете увидеть некоторые неэффективности скорости.

Редактировать: Также нашёл этот аккуратный взгляд: http://www.codeguru.com/cpp/cpp/cpp_mfc/stl/article.php/c4079

0 голосов
/ 09 февраля 2012

Попробуйте использовать трюк подкачки:

std::map<yourtype> store;
...
// release store's memory
store.swap(std::map<yourtype>());

При свопинге вы создадите временный экземпляр объекта карты, swap поменяет местами содержимое временного экземпляра и базовый экземпляр, и временный экземпляр будет уничтожен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...