作者FATCLOUD (A Cloud)
看板EE_DSnP
标题[问题] 关於 memblock 最後的回收
时间Thu Apr 30 15:50:09 2009
老师我有一些疑问
先说一些一些我的理解:
这次作业里
要做管理的 class 手上会共用一个 MemMgr
而 MemMgr 用可以存放各种长度阵列的 _recycleList 保管回收物
比方说我 new 了长度为 20 的阵列
那就会从 _activeBlock 里规划出
20*(物件大小) + (存放阵列长度的记忆体) = 20*S + SIZE_T
这麽大的记忆体
而等到要回收时
就把这个记忆体的最前端 (存放长度) 的位址
push 到 _recycleList[20] 里面去
那麽我的疑问是
如果说每一个 _recycleList 都是为了存放某种大小的阵列
那麽当 memBlock 被用完把仅剩的一点记忆体回收时
那个记忆体大小也必须刚好是某种阵列的大小才行
否则就找不到合适的 _recycleList 可以放?
========================================================
举个例子来说
1.如果今天我想要管理的 class 大小是 16 Bytes = 16*8 bits
它在 32 bit machine 上要占用四个 SIZE_T 的大小
2.而我决定使用的 memBlock 大小是一百个 SIZE_T = 100*4 bytes
3.我在上面宣告了十个 object 以後剩下六十个 SIZE_T 的空间
4.这时我想要宣告一个长度为二十的阵列,需要 20*4 +1 = 81 个 SIZE_T 的空间
剩下六十不够用故全数回收
5.我决定回收 60 SIZE_T 的空间, 回收时应该比照占用 60 SIZE_T 的阵列处理
6.世界上没有占用 60 SIZE_T 的阵列!!
因为长度 15 的阵列要用 15*4 +1 = 61 个 SIZE_T
那这样要怎麽办呢? @@
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.112.218.75
1F:推 ric2k1:依照目前的方法我们会回收长度14的阵列: 14*4+1=57 SIZE_T 04/30 18:01
2F:→ ric2k1:浪费掉 3 个 SIZE_T 的记忆体 04/30 18:01