Mail: Pass:
前月  2008年6月  翌月
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30

links

 びびすけさんのページ
 体重・走距離分析
 月間・靴・コース走距離
 タイムトライアル分析
 速度・心拍数分析
 自転車・月間・コース走距離
 オセロ勝敗・レート分析
 ViVi web site

新着日記

 はじめての AIR プログラム(汎用…
 モカ将棋 0.005 リリース
 座標がずれる
 壁にぶちあたった
 Laramie V1 に勝ち越し!
 vs Laramie V1 10番勝負
 モカ将棋10番勝負 (2)
 開発マシンが死んだ!?
 vs Lesserkai 1.3.2 10番勝負
 TJshogi にも初勝利
 Lesserkai 1.3.2 (1秒)に初勝利!
 将棋大会 地区予選
 プレイアウト結果の信頼性
 vs ランダム将棋
 moca将棋
 ViVi 2.05

新着コメント

 無題/ひらた
 直った/びびすけ
 vs Laramie V2/びびすけ
 vs LaramieV1 10…/びびすけ
 vs TJshogi 0.03…/びびすけ
 vs ランダム将…/びびすけ
 vs TJshogi 0.03/びびすけ
 羽生×山崎/びびすけ
 ボナ×渡辺竜王/びびすけ
 羽生×山崎 戦/びびすけ

トラックバック

トラックバックはありません。

カテゴリ一覧

 基本データ
 テニス
 ジョギング
 ViVi
 自転車
 Web
 RunRunDietOnline
 PostgreSQL
 ビルドアップ走
 ランニング

循環参照検出(cycle detect) (2008/06/21 10:00)

リファレンスカウント方式の循環参照対応には、大別すると以下の2種類の方法がある。(参照 3章)
[1] 定期的にマーク&スイープなどのGCを実行
[2] 循環参照を検出し、メモリ開放

(定期的に処理が重くなる)マーク&スイープなどのGCはなんとなくやりたくないので、まずは循環参照検出処理をやってみる
循環参照検出は、参照回数をデクリメントし0に達しなかったタイミングで行うことができる。
以下に深さ優先探索による単純なプログラムを示す。

bool psDelete(CRCObjectBody *ptr, std::vector<CRCObjectBody*> &vObjBody)
{
    for(すべての子オブジェクトについて) {
        CRCObject *obj = ptr->m_childPtr[ix];
        if( obj != NULL ) {
            CRCObjectBody *child = obj->m_bodyPtr;
            vObjBody.push_back(child);    //  後で参照数を元に戻すためにオブジェクトを覚えておく
            if( -- child->m_nRef == 0 ) {
                if( (child->m_flags & CRCObjectBody::ROOT) != 0 )       //  ルートに到達
                    return true;
                if( psDelete(child, vObjBody) )
                    return true;
            }
        }
    }
    return false;
}

上記関数はルートからたどってルートまで循環するかどうかを判定するのだが、途中に循環参照があった場合にうまくいかない。
さらに、循環参照を検出したとしても、そのまま delete を呼んでしまうと、delete 処理が循環してクラッシュしてしまう。
これらの問題も対処可能だと考えられるが、参照カウント処理がますます重くなってしまう。
そもそも循環参照になる確率は低いはずなのにオブジェクト削除時に毎回チェックするのは無駄である。
そこで、循環参照候補をストックしておき、閑になったときやストックがいっぱいになったときに、GCを行う方が賢い
このようなアルゴリズムは cycle collection と呼ばれる



コメント:

パス ← 半角英字で「abc」と入力してください。
名前
タイトル
コメント

( page views in recent 7 days)

パスワード忘れ
今週のランキング
計算タマちゃん
FAQ
ヘルプ
about rrdOnline