Создание настраиваемого пользовательского пула памяти / распределителя? - PullRequest
3 голосов
/ 08 сентября 2010

Можно ли в C ++ создать собственный распределитель, который работает просто так:

{
    // Limit memory to 1024 KB
    ScopedMemoryPool memoryPool(1024 * 1024); 

    // From here on all heap allocations ('new', 'malloc', ...) take memory from the pool.
    // If the pool is depleted these calls result in an exception being thrown.

    // Examples:
    std::vector<int> integers(10);
    int a * = new int [10];
}

Я не смог найти что-то подобное в библиотеках boost или где-либо еще.

Есть ли фундаментальная проблема, которая делает это невозможным?

Ответы [ 5 ]

3 голосов
/ 08 сентября 2010

Вам потребуется создать пользовательский распределитель, который вы передадите в качестве параметра шаблона в vector.Этот пользовательский распределитель, по сути, обернет доступ к вашему пулу и выполнит любые проверки размера, которые он хочет.

2 голосов
/ 08 сентября 2010

Да, вы можете создать такую ​​конструкцию, она используется во многих играх, но вам, в основном, нужно реализовать свои собственные контейнеры и вызвать методы выделения памяти для того пула, который вы создали.

Вы также можете поэкспериментировать с написанием пользовательского распределителя для контейнеров STL, хотя кажется, что такая работа вообще не рекомендуется. (Я делал это раньше, и это было утомительно, но я не помню особых проблем.)

Ум - написание собственного распределителя памяти не для слабонервных. Вы могли бы взглянуть на malloc Дуга Ли, который предоставляет «пространства памяти», которые вы могли бы использовать как-нибудь в своей структуре видимости.

1 голос
/ 08 сентября 2010

Я отвечу на другой вопрос.Посмотрите на книгу «Эффективный С ++».Одна из вещей, которые они обсуждают, это реализация такого рода вещей.Это было для веб-сервера

Для этой конкретной вещи вы можете либо возиться на уровне c ++, переопределив новый и предоставив пользовательские распределители для STL.

Или вы можете возиться на уровне malloc, начать с пользовательского malloc и работать оттуда (например, dmalloc)

0 голосов
/ 08 сентября 2010

Если предполагается, что все выделения в этой области происходят с этим объектом-распределителем, то это по сути локальная переменная потока.

Итак, возникнут проблемы с многопоточностью, если вы используете static или глобальную переменную для ее реализации. В противном случае неплохой обходной путь для безгражданства распределителей.

(Конечно, вам нужно будет передать второй аргумент шаблона, например, vector< int, UseScopedPool >.)

0 голосов
/ 08 сентября 2010

Есть ли фундаментальная проблема, которая делает это невозможным?

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

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