2011-07-17 7 views
0

私は練習目的のためにグラフィカルエンジンを開発し始めています。発生した最初の質問の1つは、ハンドルまたはスマートポインタを使用してクラスインスタンスを参照することです。ハンドル対スマートポインタ。何を使用するのですか?

私の視点から:

  • スマートポインタ長所:需要の下で作成された、彼らは古いポインタになることの問題はありません。欠点:リンクされたリストにあるので、ポインタの検索はO(n)操作です。

  • Handles pros:検索はO(1)、オブジェクトの再配置はO(1)です。 cons:古いポインタになり、新しいハンドルを作成すると、システムはハンドルテーブルの最初のNULLエントリをチェックします。

どちらを選択しますか?あなたの選択を説明してください。

編集:

を私はあなたのコメントと回答した後、いくつかのポイントを明確にしたいです。

スマートポインタが「STLリンクリストで表されている」という方法でリンクされたリストであるとは限りません。つまり、リンクされたリストとして動作するということです(あるオブジェクトをあるメモリブロックから別のオブジェクトに移動する場合、このオブジェクトへのすべての参照を正しく更新するためにスマートポインタの完全なリストを反復する必要があります。リンクリスト - )。

そして、私は正確に不透明なポインタまたは実装モデルへのポインタとして扱うわけではありません。私はグローバルハンドルテーブル(ポインタの配列)を持っているので、オブジェクトを要求すると、オブジェクトへの実際のポインタを見つけることができるこのテーブルのインデックスを含む逆参照可能なインスタンスが得られます。したがって、オブジェクトをあるブロックから別のブロックに移動すると、ハンドルテーブルのポインタエントリを更新するだけで、すべてのポインタが同時に自動的に更新されます。

+4

「ハンドル」という用語を使用したときに覚えていることを正確に説明できますか? –

+1

また、「ポインタを検索している」ということはどういう意味ですか、スマートポインタがリンクリストに格納されているのはなぜですか? – interjay

+0

@davidcm:通常、 'handle'は、デバイスやファイルを開くための最初の最初の呼び出し後に、識別子として使用される不透明なエンティティ(多分ポインタ)を意味します。ここに。 –

答えて

2

これらの定義のいずれも、通常使用されているものに適合しません。スマートポインタはリンクされたリストにはまったくありません。通常はオブザーバパターンを使用して、反復処理が必要な場合に存在するオブジェクトへの生ポインタのベクトルを保持します。あなたが記述しているようにハンドルはバイナリ互換性の理由から、そしてプロセス内では決して使用されていません。

スマートポインタを使用すると、彼らは自分自身を世話します。

1

「ハンドル」という用語は、本質的に、オブジェクトへのという識別子を意味する広義の用語です。

ポインタまたはスマートポインタは、この定義に該当するので、私はあなたには、いくつかの固定、メモリ・抽象化「他の識別子」を意味することを前提とした場合、あなたはあなたのオプション2

   "Handle" 
       | 
      /------+-------\ 
     /  |   \ 
     /  |   \ 
    Pointer Reference Other Identififer 
     |   |    \ 
    |----+----| `T&`    \ 
    |   |     |---+------| 
`T*` `shared_ptr<T>`  Text  Number (e.g. HWND in WinAPI) 

ためterser用語を選択する必要がありますそして、確かに、これを採用することができます。ここには必ずしも/またはシナリオがありません。とにかくスマートポインタを使用したい場合は(それ以外の場合は生涯管理用)、スマートポインタにはにはをリンクリストにする必要はありません。

あなたの固定されたユーザー定義の識別子を潜在的に変化するスマートポインタにマップするには、std::map<your_identifier_type, std::shared_ptr<T> >があります。


免責事項:この図は、急いで描かれ、それは半分の時間ベッドから出るの後、今立っているとして用語木の私のビジョンを示しました。他の見解との小さな違いがあるかもしれませんが、かなり信頼できる印象を与えるはずです。

関連する問題