Одним из примеров того, как я их использовал, была работа со встроенными системами с очень ограниченными ресурсами. Допустим, у вас есть 2 КБ свободной оперативной памяти, и ваша программа должна использовать часть этой памяти. Вам нужно хранить, скажем, 4-5 последовательностей где-то вне стека, и, кроме того, вам нужен очень точный доступ к тому, где эти вещи хранятся, это ситуация, когда вы можете написать свой собственный распределитель. Реализации по умолчанию могут фрагментировать память, это может быть неприемлемо, если у вас недостаточно памяти и вы не можете перезапустить программу.
Один проект, над которым я работал, заключался в использовании AVR-GCC на некоторых маломощных чипах. Нам нужно было хранить 8 последовательностей переменной длины, но с известным максимумом. реализация стандартной библиотеки управления памятью представляет собой тонкую оболочку вокруг malloc/free, который отслеживает, где размещать элементы, добавляя перед каждым выделенным блоком памяти указатель на конец этого выделенного участка памяти. При выделении новой части памяти стандартный распределитель должен пройтись по каждой из частей памяти, чтобы найти следующий доступный блок, в котором будет соответствовать запрошенный размер памяти. На настольной платформе это было бы очень быстро для этих нескольких элементов, но вы должны иметь в виду, что некоторые из этих микроконтроллеров очень медленные и примитивные по сравнению с ними. Кроме того, проблема фрагментации памяти была серьезной проблемой, и у нас действительно не было другого выбора, кроме как использовать другой подход.
Поэтому мы реализовали собственный пул памяти. Каждый блок памяти был достаточно большим, чтобы вместить самую большую последовательность, которая нам понадобится. Это заранее выделяло блоки памяти фиксированного размера и помечало, какие блоки памяти используются в данный момент. Мы сделали это, сохранив одно 8-битное целое число, где каждый бит представлял собой использование определенного блока. Здесь мы пожертвовали использованием памяти, чтобы попытаться ускорить весь процесс, что в нашем случае было оправдано, поскольку мы приближали этот чип микроконтроллера к его максимальной вычислительной мощности.
В ряде других случаев я вижу, как вы пишете свой собственный настраиваемый распределитель в контексте встроенных систем, например, если память для последовательности не находится в оперативной памяти, как это часто бывает в эти платформы.
person
Community
schedule
11.07.2015
boost::pool
иboost::interprocess
- person Mooing Duck   schedule 21.07.2021