我有一个在n维空间中存储点的类。对于维度数,它有一个整数n,对于沿每个轴的距离,它有一个指向数组的指针。它所处的程序创造并摧毁了许多这样的东西。为了防止内存碎片,我使用内存池。我有类本身的'class pool'和每个数组长度的'array pool'。
在处理创建这些时,序列将是:从第一个内存池中获取整个类的副本,使用维度(n)构造类,确定正确的“数组池”是否正确,或者是否正确不存在,创建它,获取指向类的内存段的指针,然后返回整个事物。本质上,类始终是相同的,其内部数组的大小和内部数组来自哪个池有所不同。
我可以想到几种方法来解决这个问题,但我倾向于选择一种处理所有这些问题的工厂类。
这是适合选择的模式吗?有更优选的方法吗?
答案 0 :(得分:2)
内存池通常用于微调内存分配。
池分配对象的一些常见主题:
上述陈述越多,使用内存池就越有潜在的好处。
现在,如果要从内存池中分配对象(而不是内部分配),则有多个选项:
使用pool-allocator:
template<class pool, class... ARG> auto new(size_t s, pool& p, ARG&&... arg)
-> typename std::enable_if<std::is_same<
decltype(p.allocate(s, std::forward<ARG>(ard)...))
, void*>>*
{ return p.allocate(s, std::forward<ARG>(ard)...); }
// Used like this:
auto p = new(mypool, optional_pool_args...) myclass(myargs...);
你可能想要提供一个匹配的deallocator来支持直接将内存返回池,出错或任何其他情况......
此外,没有什么能阻碍你在课堂上使用同样的东西。
您也可以将其作为一个支持分配器的容器&#34;,就像标准库中那样。