MemoryPool 的确定性编译时映射函数

Deterministic compile time mapping function for MemoryPool

请参考下图,我试图展示我正在尝试实现的内容:

有几个内存 Partition 静态分配在包含各种大小的 chunks 的内存中,在编译时已知。每个分区有 chunks 个不同的大小。 Partition 实现了 IPartition 接口。指针 IPartition * 在 C 样式数组中组织,其中 idx0..nPartitions.

范围内该数组的索引

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

目标/任务/问题:

我需要设计一个函数constexpr unsigned int func( size_t size ),它将要分配的对象的size和return索引idx到[=的数组15=] 指向 "right" 分区的指针,该分区具有适当的 size.

为了让事情变得更复杂,func() 必须花费恒定的时间来使用内存池确定性.

来保持整个内存分配

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

如果有人能帮助我按照最佳方式进行操作,我将非常高兴...

非常感谢任何愿意提供帮助的人!

您可以对尺寸进行二分查找。这是分区数量中每个 return、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;
}

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