TCMalloc源码阅读(二)--线程局部缓存ClassSize分析

本文深入探讨TCMalloc的小对象分配机制,关注如何划分小对象以及如何映射到特定缓存。通过分析SizeMap类的初始化和AlignmentForSize函数,揭示了对象大小与缓存之间的关系,特别提到了LgFloor函数在确定对象对齐方式中的作用。
摘要由CSDN通过智能技术生成

TCMalloc小对象分配机制

首先我们回顾下TCMalloc文档的小对象分配机制。文档中说明TCMalloc给每个线程都保存一个缓存池,缓存池里有各种大小的内存对象。小内存分配过程如下:
1. 将要分配的大小映射到对应的对齐对象。
2. 在当前线程的局部缓存中查找该对齐对象链表。
3. 如果该链表不为空,删除链表第一个节点并返回给调用者。

问题

1. 小对象是如何划分的?

2. 对于任意一个小于kMaxSize的size是如何映射到某一种缓存对象上?

本文将通过分析源代码来弄清楚这两个问题。

SizeMap分析

在do_malloc函数中有如下两行代码:
size_t cl = Static::sizemap()->SizeClass(size);
size = Static::sizemap()->class_to_size(cl);
不难理解,这两行代码就是size映射到它最接近的缓存对象上。接下来继续探究SizeClass(size_t)和class_to_(size_t)两个函数,这两个函数在common.h文件中,代码如下:

class SizeMap
{
private:
    ... //其他暂时不关心的
    //-------------------------------------------------------------------
    // Mapping from size to size_class and vice versa
    //-------------------------------------------------------------------


    // Sizes <= 1024 have an alignment >= 8.  So for such sizes we have an
    // array indexed by ceil(size/8).  Sizes > 1024 have an alignment >= 128.
    // So for these larger sizes we have an array indexed by ceil(size/128).
    //
    // We flatten both logical arrays into one physical array and use
    // arithmetic to compute an appropriate index.  The constants used by
    // ClassIndex() were selected to make the flattening work.
    //
    // Examples:
    //   Size       Expression                      Index
    //   -------------------------------------------------------
    //   0          (0 + 7) / 8                     0
    //   1   
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值