0

有没有办法一次释放所有对象boost::singleton_pool

我看到我可以访问这些方法:

static void free(void *const);
static void ordered_free(void *const);
static void free(void *const, const size_type);
static void ordered_free(void *const, const size_type);

我想我可以通过手动迭代它们来使用它们来释放所有对象。但是,有没有办法说“释放所有对象”以便池再次完全释放?

本质上,我想要类似的东西,purge_memory()但这不会将内存释放回系统,而是将其分配在池中。

原因是我在池中构建了一个大对象(~2GB),我想很快摆脱它并开始构建一个新对象。当前调用purge_memory()大约需要 2 秒,并且还会向系统释放内存(在诊断或任务管理器中,您可以看到进程内存在减少)。我希望通过简单地释放池中的东西而不实际解除分配,我可以非常快速地炸毁第一个对象并开始构建下一个对象。

4

1 回答 1

0

假设您在 singleton_pool 中分配了 1000 个对象,总计 2 GB。如果有一个“free_all()”函数(没有),你将如何确保你仍然没有指向池中包含的数据的指针?您需要遍历所有此类指针以重置它们。当你这样做的时候,你不妨打电话singleton_pool::free(ptr)给每个人。

基本上,您要求的 API 不存在,并且可能不应该存在。如果您想要最灵活(在我看来也是最有用的)API,请使用常规的 boost::pool,而不是经常阻碍优化的顶层。然而,它仍然没有“free_all()”函数,因为这又是一个错误农场。

于 2019-12-06T12:51:19.710 回答