MemoryPool 的确定性编译时映射函数
Deterministic compile time mapping function for MemoryPool
请参考下图,我试图展示我正在尝试实现的内容:
有几个内存 Partition
静态分配在包含各种大小的 chunks
的内存中,在编译时已知。每个分区有 chunks
个不同的大小。 Partition
实现了 IPartition
接口。指针 IPartition *
在 C 样式数组中组织,其中 idx
是 0..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;
}
给定一个(排序的)编译时大小列表,也应该可以进行模板元编程,但我不知道这是否是您的用例。
请参考下图,我试图展示我正在尝试实现的内容:
有几个内存 Partition
静态分配在包含各种大小的 chunks
的内存中,在编译时已知。每个分区有 chunks
个不同的大小。 Partition
实现了 IPartition
接口。指针 IPartition *
在 C 样式数组中组织,其中 idx
是 0..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;
}
给定一个(排序的)编译时大小列表,也应该可以进行模板元编程,但我不知道这是否是您的用例。