是否适合将工厂用于使用多个内存池的类?有更好的模式/技术吗?

时间:2014-08-22 17:43:50

标签: c++ memory-management factory

我有一个在n维空间中存储点的类。对于维度数,它有一个整数n,对于沿每个轴的距离,它有一个指向数组的指针。它所处的程序创造并摧毁了许多这样的东西。为了防止内存碎片,我使用内存池。我有类本身的'class pool'和每个数组长度的'array pool'。

在处理创建这些时,序列将是:从第一个内存池中获取整个类的副本,使用维度(n)构造类,确定正确的“数组池”是否正确,或者是否正确不存在,创建它,获取指向类的内存段的指针,然后返回整个事物。本质上,类始终是相同的,其内部数组的大小和内部数组来自哪个池有所不同。

我可以想到几种方法来解决这个问题,但我倾向于选择一种处理所有这些问题的工厂类。

这是适合选择的模式吗?有更优选的方法吗?

1 个答案:

答案 0 :(得分:2)

内存池通常用于微调内存分配。

池分配对象的一些常见主题:

  • dtors是微不足道的。
    • 或者几乎没有例外。
      • 或者至少可以用同样的方式调用它。
  • 他们都需要同时清理。
  • 他们需要以LIFO顺序清理。
  • 它们都是同一类型。
    • 或者至少他们有相同的尺寸。
      • 无论如何,相同的对齐要求仍然存在。

上述陈述越多,使用内存池就越有潜在的好处。

现在,如果要从内存池中分配对象(而不是内部分配),则有多个选项:

  • 使用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;,就像标准库中那样。

  • 使用特定于类的分配器:
    只需将分配器添加到课程中,请参阅Operator overloading
  • 使用工厂功能手动执行所有步骤并使用placement-new。