G2.9 std_alloc

本文详细介绍了G2.9std::alloc的运行模式,包括链表管理和不同请求大小下的内存分配策略。通过实例展示如何处理各种大小的内存请求,并讨论了嵌入式指针的应用。

1.G2.9 std::alloc运行模式

  (1) 每个链表都是20*2,20个切割好,其余的20个作为战备池

  (2)分配的范围在8K~128K。

   

2.embedded pointers

    (1)当客户段使用小区快,获得的既是char*(指向某个union obj)。此时虽然客户端没有诸如LString或ZString之类的信息可得知区块大小,但由于区块是给object所用,相当于object大小,object ctor自然不会过分。

   (2)union obj {

                     union obj* free_list_link;

              };

              改用struct可

         

3.std_alloc运行一瞥

       (1)初始时的16个链表

             

      (2)申请32bytes

                  

                                                  

                 申请32bytes,由于pool为空,故所取并成功向pool灌注32*20*2 + RoundUp(0>>4)=1280,从中切出1个区块返回客户,19个区块给list#3,余640备用,

                  >累计申请量:1280

                  >pool大小:640

       (3)申请64bytes(连线表示链表连在一起)

                 

    (4)申请96bytes

                

                战备池pool为空,累计申请量为1280/16=80,调整为8的倍数

                累计申请量:1280+96*20*2+80 = 5200

                战备池pool大小:96*20*2+80-96*20 = 2000

     (5)申请88bytes(连线表示链表连在一起)

             

             挂在88/8-1在10个链表,战备池有剩余,切割88*20,剩余战备池pool大小:2000-88*20=240

      (6)连续三次申请88bytes

                

      (7)申请8bytes

               

               战备池pool大小:240-8*20=80

     (8)申请104bytes

             

              战备池pool大小为80不足104bytes,80/8-1=9,将战备池pool挂到第9个链表

              新申请104*20*2+[累计申请总量5200/16=325调整8的倍数328]

              战备池pool大小104*20*2+328-104*2=2408

    (9)申请112bytes

               

                累计申请量:9688

                pool大小:2408-112*20=168

    (10)申请48bytes

               

                 累计申请量:9688

                 战备池pool大小:168-48*3=24

   (11)现在假设内存10000bytes,继续申请72bytes

              

              挂在9处的为80bytes,然后剪断,挂在第8个链表,战备池剩余80-72=8

  (12)继续申请72bytes

              

               战备池pool大小不足72bytes,然后将战备池8bytes挂在第0个链表;

              向右边继续查找,在第10个链表,截取72bytes,战备池剩余88-72=16

(13) 申请120bytes

            

              战备池pool大小16不足120,然后将16bytes/8-1=1挂在第1个链表

             向右查找>120,没有申请失败

(14)检讨

            

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值