1

请参考下面的图片,我试图展示我正在尝试实现的内容: 在此处输入图像描述

在包含各种大小的内存中,有几个Partition静态分配的内存,在编译时是已知的。chunks每个分区都有chunks不同的大小。Partition实现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。也许解决方案可能是一个哈希表,其中在编译时计算哈希(分区数和块大小在编译时已知),我不知道......

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

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

4

1 回答 1

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;
}

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

于 2018-07-10T13:37:06.413 回答