Mail: Pass:
前月  2008年5月  翌月
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 31

links

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

新着日記

 zLib
 ViVi 2.x リリースチェック時間統計
 趣味悠々
 ViVi version 3.0 M-2 進捗
 ViVi週間DL数
 ViVi 3.0 開発方針
 記録更新
 ViVi 2.04 (RC版) リリース
 本サイトのアクセス数統計
 ViVi version 3.0 マイルストーン…
 ViVi ver 3 マイルストーン1 進…
 フォント選択可能@V3
 ViVi version 3.0 タスクリスト・…
 CycleCollection in リファレンス…
 循環参照検出(cycle detect)
 循環参照によるメモリリーク (2)

新着コメント

 おお/びびすけ
 再放送/川瀬
 アップ/びびすけ
 あーー!/スパイダーマン
 放映/びびすけ
 どもども/びびすけ
 必見だぁ^^/oyaji_aoba
 おおー!/スパイダーマン
 補足/びびすけ
 HGP行書体/びびすけ

トラックバック

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

カテゴリ一覧

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

2件の日記があります。

C++コンパイル時ファイル依存性の… (2008/05/16 14:45) 0 comment

いまさらな感はあるが、C++コンパイル時ファイル依存性の削減について記述しておく

クラスA がクラスBを利用する方法には継承(is-a)と委譲(has-a)がある。
委譲も細かく見ると、クラスAがクラスBのインスタンスをメンバ変数として含む場合と、クラスBへのポインタを保持する場合がある。
前者は狭義の has-a 関係で、包含とも呼ぶ。後者は holds-a の関係とも呼ばれる。
holds-a の場合、ポイント先オブジェクトの所有権を持つ場合と持たない場合がある。
コーディング的には、初級権を持つ場合は std::auto_ptr を使用し、そうでない場合は 単なるポインタとするのがよいと考える。
継承(is-a)、包含(狭義の has-a)の場合、参照元は参照するクラスのヘッダファイルをインクルードする必要がある。
しかし、委譲(holds-a)の場合は、ヘッダファイルではクラス名を宣言するだけで、ヘッダファイルをインクルードする必要はない。
ヘッダファイルをインクルードする必要があることを「コンパイル時ファイル依存性」と呼ぶ。
あるファイルを編集すると、それに直接・間接的に依存しているファイルをすべてコンパイルする必要がある。

他のクラスを利用する方法として、実装ファイルでクラスインスタンスを作成し、利用する方法がある。これを uses-a の関係と呼ぶ。
クラスXがクラスAを利用する場合、クラスAのヘッダファイルをインクルードする必要がある。クラスAとクラスBが has-a の関係の場合、クラスXは間接的にクラスBのヘッダファイルに依存している。
大量のファイルがクラスAを利用する場合、クラスBのヘッダに間接的に依存することになり、ファイル依存性が高くコンパイル時間が膨大になる可能性がある。
これに対して、クラスAとクラスBが holds-a の関係の場合は、クラスBのヘッダに依存することはなく、クラスBのヘッダを修正しても再コンパイルの必要がなくなる

C++コンパイル時ファイル依存性の… (2008/05/16 15:00) 0 comment

C++コンパイル時ファイル依存性を削減するために用いられるもうひとつの方法がインプリメンテーションクラスを導入する方法である。
多くのファイルで利用されるクラスAがある場合、クラスAはパブリックなメンバ関数のみを持つようにし、実装は別のクラス:クラスA-impl に任せるようにする。
クラスAはインプリクラスを hold する。

"classA.h":
class ClassAimpl;
class ClassA
{
public:
  ClassA();
  メンバ関数...
private:
    std::auto_ptr<ClassAimpl> m_impl;
};

メンバ関数の処理はすべて、m_impl に委譲するようにコーディングする。
このテクニックにより、クラスAの(インタフェースが変わらず)実装方法が変わっても、クラスAを利用するクラスを再コンパイルする必要がなくなる。
このテクニックは 絶縁(insulation)と呼ばれる

2件の日記があります。

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