MemoryPool的确定性编译时间映射功能

时间:2018-07-10 12:21:24

标签: c++ c++14 hashtable memory-pool

请参考下面的图片,其中我试图展示我要实现的内容: enter image description here

在包含Partition的内存中静态分配了几个内存chunks,这些内存在编译时是已知的。每个分区具有不同大小的chunksPartition实现IPartition接口。指针IPartition *在C样式数组中组织,其中idx是该数组在0..nPartitions范围内的索引。

在我的自定义operator new(size_t size)实现中,我将使用上述概念返回适当大小的内存块,其中任何大小的类型都适合。明显的要求是块大小必须等于或大于类型的大小。

目标/任务/问题:

我需要设计一个函数constexpr unsigned int func( size_t size ),该函数将要分配的对象的size并返回指向idx指针数组的索引IPartition *具有适当size块的“正确”分区。

为了使事情变得更复杂,func()必须花固定的时间来使用确定性的内存池来保持整个内存分配。

整件事使我指向std::unordered_map,但是目标系统是资源有限的小型MCU。也许解决方案可能是一个哈希表,其中的哈希是在编译时计算的(分区数和块大小在编译时是已知的),我不知道...

如果有人可以帮助我遵循最佳的做法,我将非常高兴...

在此先感谢任何愿意提供帮助的人!

1 个答案:

答案 0 :(得分:1)

您可以对大小进行二进制搜索。这是每次返回的常量,分区数量为O(log(N)),只有一点点烦人的手写操作。对于您的四个块大小,将是:

constexpr unsigned int func( size_t size )
{
  if (size <= 4)
    if (size <= 3)
      return 0;
    else
      return 1;
  else
    if (size <= 8)
      return 2;
    else
      return 3;
}

给定一个(排序的)编译时大小列表,也应该可以对该模板进行模板元编程,但是我不知道这是否是您的用例。