看板 EE_DSnP 關於我們 聯絡資訊
※ 引述《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
timrau:倒數第二行:64-bit機器上size_t也是64 bit 06/20 09:02
timrau:如果有修改過size_t和unsigned混在一起用的程式就知道... 06/20 09:02
ric2k1:感謝. 其實我在寫這個程式的時候並沒有考慮到太多 64-bit 06/20 11:32
ric2k1:的 issue, 不知道 run 64-bit 的同學有沒有發現什麼問題? 06/20 11:33
※ 編輯: spock 來自: 218.160.64.31 (06/20 12:37)