我正在评估Protobuf Arena分配以与非protobuf相关的类一起使用。就像一个从内存池中轻松分配/释放对象的工具。
我还没有在其API(https://developers.google.com/protocol-buffers/docs/reference/cpp/google.protobuf.arena#Arena)中找到指定竞技场使用的最大内存的方法。我想限制内存使用量并允许使用Arena的程序死掉,而不是消耗比预期更多的内存。
还有其他用于内存池管理的C ++库值得检查吗? Protobuf竞技场很容易使用,这就是我开始使用它的原因。
答案 0 :(得分:0)
没有真正的内置功能来限制内存使用量,但我相信你可以通过在ArenaOptions上设置正确的挂钩来实现相同的结果。您可能希望特别设置on_arena_init
和on_arena_allocation
挂钩。在on_arena_init
中,您可以创建一个对象来存储您的状态(可能只是到目前为止分配的字节数)并将其作为void*
返回。然后每次竞技场需要分配更多内存时,它会调用你的on_arena_allocation
钩子并将你的void*
作为cookie
参数传递,这样你就可以更新你的大小计数器并声明它低于指定的记忆帽。请注意,这将跟踪竞技场从系统分配器获取的内存块,而不是竞技场分发给应用程序代码的内存块,但听起来这可能是您想要的行为。您可能还需要设置on_arena_reset
和on_arena_destruction
挂钩:前者将您的计数器重置为零,后者则删除您的cookie以避免内存泄漏。