Я хочу заменить некоторый код, использующий boost::interprocess
разделяемую память. Одним из преимуществ разделяемой памяти является то, что вы можете наложить ограничения на максимальный объем используемой памяти. Я ищу собственный распределитель, основанный на std::allocator
, который может это сделать.
Только определенные классы в программе будут использовать этот распределитель, все остальное использует значение по умолчанию std::allocator
и ограничено только доступной оперативной памятью.
Я пытаюсь написать один из своих собственных, но сталкиваюсь с проблемами, в основном с тем, как разделить состояние между копиями распределителя, созданными контейнерами STL. Состояние включает количество оставшихся свободных байтов и максимальный размер, который может использовать распределитель. Я думал, что смогу сойти с рук, сделав их thread_local
, но тогда несколько разных экземпляров одного и того же класса будут выделять и освобождать память из одной и той же ограниченной кучи, а это не то, чего я хочу. Я начинаю думать, что это невозможно, отсюда и этот вопрос. На данный момент ни непрерывное распределение, ни производительность не являются основными требованиями.
Жесткое ограничение на объем памяти также не может быть параметром шаблона, оно считывается из конфигурационного файла.
Изменить. Проблема с состоянием совместного использования заключается в том, что некоторые контейнеры вызывают конструктор по умолчанию типа распределителя. Очевидно, что этот конструктор не может ничего знать о внешнем мире, даже если используется shared_ptr
, он будет инициализирован nullptr. Например, посмотрите исходный код для std::string::clear
g++ (Ubuntu 4.8.4-2ubuntu1~14.04) 4.8.4
shared_ptr
на объект, управляющий указанным состоянием. - person Igor Tandetnik   schedule 10.08.2015