作者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