作者spock ()
看板EE_DSnP
標題Re: [問題] 我還是不太懂support的意義
時間Fri Jun 20 02:13:56 2008
※ 引述《SweepingMonk ((((((((((()))))))))))》之銘言:
: 請問
: _supports 在 BddMgr init 之後,是不是就不會再變動了?
: 如果是的話,那表示每個 level 的 supports 都是一樣的
: 這麼做的用意是?(既然都一樣,難道不能用share的嗎?)
: 還是我對supports的認知錯誤?
根據老師上課講的印象:(有錯請大家指正)
只要不呼叫 reset 或 init 就不會變。
_support 是幫每一個 level 先建好一個輸入的 BddNode,這個 node
指向每一層自己的 _one 與 _zero。但是這些 _one 與 _zero 都是 level 0 那個
_one 與 _zero 的 copy,所以他們的 _nodeV 會指向同一個 terminal。
而你可以指定很多個不同名字的 BddNode 全部指向同一個 _support,這樣代表是
同一條 input。
在老師的架構中,每個 node 到底被多少人使用,是交給 BddNode 的 constructor
與 destructor 計算。這個數字就是 _refCount。
constructor 創造 node 的時候,要把 _nodeV 指到的那個 node 的 _refCount + 1,
node 消滅的時候,destructor 會把 _nodeV 指到的那個 node 的 _refCount - 1。
為什麼要紀錄這個數字,因為寫到後來可以加入 delete 沒人用的 node,回收記憶體
的功能。
如果用指標指向任何一個 BddNode,那麼建立指標與摧毀指標的時候,就沒有現成的
constructor 與 destructor 可用。唯一的方法就是自己再寫 code 對 _refCount
作加減。
這樣也不是不可以,只是寫程式的人總習慣想一些偷懶的辦法,程式才不會整天
出現抓不完的 bug。
另外一點是,BddNode 佔 4 bytes,因為它裡面只有一個 32-bit size_t 的 _nodeV。
在 32-bit 機器上,一個 pointer 也佔 32 bits,所以使用 pointer 不會節省記憶體。
在 64-bit 機器上,size_t 與 pointer 一樣都是 64 bit。(感謝饒神指正)
如果你構思這個程式的時候,沒有打算回收記憶體,當然就不會想到要這樣設計。
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 218.160.64.31
1F:推 timrau:倒數第二行:64-bit機器上size_t也是64 bit 06/20 09:02
2F:→ timrau:如果有修改過size_t和unsigned混在一起用的程式就知道... 06/20 09:02
3F:推 ric2k1:感謝. 其實我在寫這個程式的時候並沒有考慮到太多 64-bit 06/20 11:32
4F:→ ric2k1:的 issue, 不知道 run 64-bit 的同學有沒有發現什麼問題? 06/20 11:33
※ 編輯: spock 來自: 218.160.64.31 (06/20 12:37)