2016-09-20 3 views
0

Я оцениваю распределение Protobuf Arena для использования с классами, не связанными с протобуфом. Также как инструмент для легкого выделения/освобождения объектов из пула памяти.Protobuf: Максимальный размер памяти для Арены

Я не нашел в своем API (https://developers.google.com/protocol-buffers/docs/reference/cpp/google.protobuf.arena#Arena) способ указать максимальную память для используемой арены. Я хочу ограничить использование памяти и позволить программе использовать Арену, чтобы умереть, а не потреблять больше памяти, чем ожидалось.

Есть ли еще библиотека C++ для управления пулами памяти, которую стоит проверить? Макет Protobuf довольно прост в использовании, поэтому я начал с него.

ответ

0

Нет реальной встроенной функции для ограничения использования памяти, но я считаю, что вы можете добиться того же результата, установив правильные крючки на ArenaOptions. В частности, вы должны установить крюки и on_arena_allocation. В on_arena_init вы можете создать объект для хранения вашего состояния (возможно, только счетчик байтов, выделенных до сих пор) и вернуть его как void*. Затем каждый раз, когда Арене нужно выделять больше памяти, он вызывает ваш крючок on_arena_allocation и передает в ваш void* аргумент cookie, поэтому вы можете обновить счетчик размера и утверждать, что он находится ниже вашей выделенной памяти. Обратите внимание, что это будет отслеживать блоки памяти, извлеченные Арене из системного распределителя, а не блоки памяти, переданные Арене, в код приложения, но похоже, что это, вероятно, поведение, которое вы хотите. Вам также может потребоваться установить крючки on_arena_reset и on_arena_destruction: первый для сброса счетчика на ноль, а второй - для удаления вашего файла cookie, чтобы избежать утечки памяти.

Смежные вопросы