正在计算大小 class

Calculating size class

高性能 malloc 实现通常实现隔离的空闲列表,也就是说,每个更常见(较小)的大小都有自己单独的空闲列表。

第一次尝试可以说,低于某个阈值,大小 class 就是大小除以 8,四舍五入。但是实际的实现有更多的细微差别,将公认的大小 classes 安排在类似指数曲线的东西上(但比在每一步简单地加倍更温和),例如http://jemalloc.net/jemalloc.3.html

我正在尝试弄清楚如何在某些此类曲线上将尺寸转换为 class 尺寸。现在,原则上这并不困难;有几种方法可以做到这一点。但是要达到加速common case的预期目标,确实需要快,最好只有几条指令。

进行此转换最快的方法是什么?

在黑暗时代,当我曾经担心这些事情时,我只是从最小的开始遍历所有可能的尺寸。

这实际上很有意义,因为分配内存强烈意味着实际分配之外的工作——比如初始化和使用该内存——这与分配大小成正比。在除最小分配之外的所有分配中,该开销将淹没您为选择大小所花费的一切 class。

只有小的才真正需要快

假设您想要使用两个尺寸的所有幂和一个加一半的尺寸,即 8、12、16、24、32、48、64 等 ... 4096。

检查该值是否小于或等于 4096,我任意选择该值作为此示例的最高可分配值。

获取结构的大小,然后使用设置的最高位乘以二,如果下一位也已设置则加 1,并且您在大小列表中获得索引如果值高于这两位将给出的值。应该是 5-6 条 ASM 指令

所以 26 是 16+8+2 位是 4,3,1 4*2 + 1 + 1 所以第 10 个索引被选为 32 字节列表。

您的系统可能需要一些最小分配大小。

此外,如果您进行大量分配,请考虑使用一些对您的程序私有的池分配器,并从系统分配器中进行备份。