作者yea107 (ㄚ隆)
看板EE_DSnP
标题Re: [问题] 关於 memblock 最後的回收
时间Tue May 5 07:36:32 2009
借用一下...
这个问题最後的结论是要回收长度14的array
也就是回收14*4+1个SIZE_T
我的问题是...
这样的机制是在哪里发生的呢???
是在老师已经写好的code里吗??还是要自己handle??
还有,其实我一直都不了解SIZE_T、SIZE_T_1、toSizeT(t)的用处耶
(就感觉上好像就是跟我的问题有关)
请不吝指教
感恩~~~
---------------------------------------------------------------------------
※ 引述《FATCLOUD (A Cloud)》之铭言:
: 标题: [问题] 关於 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
: 推 ric2k1:依照目前的方法我们会回收长度14的阵列: 14*4+1=57 SIZE_T 04/30 18:01
: → ric2k1:浪费掉 3 个 SIZE_T 的记忆体 04/30 18:01
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 115.43.124.54
1F:推 ric2k1:Compiler 会自己计算好 然後将size传给你 overload的 new[] 05/05 10:00
2F:→ ric2k1:SIZE_T, SIZE_T_1, toSizeT(t) 只是 macros 方便你在写程式 05/05 10:01
3F:→ ric2k1:时取代 sizeof(size_t), (sizeof(size_t) - 1), ... 等等 05/05 10:01
4F:→ yea107:老师其实我最不懂的是toSizeT(t)的用法,哪里会需要呢? 05/05 11:05
5F:→ yea107:老师对不起...可是我问的是在free时,如果还剩60 SIZE_T的 05/05 11:06
6F:→ yea107:空间,那我们应该把它储存在长度14的array中,这件事要自己 05/05 11:07
7F:→ yea107:handle吗??也就是找出最大的n使得n*SIZE_T+1<(remand byte) 05/05 11:09
8F:→ yea107:是要我们自己做,还是这就是toSizeT(t)的用处呢?? 05/05 11:10
9F:→ yea107:好像打错字了...remain... 05/05 11:23
10F:推 ric2k1:60 Bytes 吧? 是的, 你自己要判断这剩下的 60B 可以回收的 05/05 11:25
11F:→ ric2k1:的 array 最大是多少? 这时 toSizeT(t) 也许就有用处, 05/05 11:26
12F:→ ric2k1:它可以将 t promote 到最接近的 SIZE_T 的倍数. 不过偷偷说 05/05 11:26
13F:→ ric2k1:其实我後来的 code 有多加了一个 macro, "downToSizeT(t)" 05/05 11:27
14F:→ ric2k1:意思你们可以自己猜, 你们要自己加也可以. 05/05 11:28
15F:→ yea107:谢谢老师回答 05/05 12:56