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