在包含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。也许解决方案可能是一个哈希表,其中的哈希是在编译时计算的(分区数和块大小在编译时是已知的),我不知道...
如果有人可以帮助我遵循最佳的做法,我将非常高兴...
在此先感谢任何愿意提供帮助的人!
答案 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;
}
给定一个(排序的)编译时大小列表,也应该可以对该模板进行模板元编程,但是我不知道这是否是您的用例。