2012-11-07 6 views
5

私はSTL実装(SGI、STLport、libC++)のいくつかのソースを見ていて、すべての実装やほとんどの実装に共通するデザインパターンをいくつか見ていました。私は良いresonがなければならないと仮定し、それが何であるかを知りたい:他の人の間でvectorlist_iterator含むデザインの根拠STLの背後

  1. 多くのクラスは、例えば、2クラスとして実装されました機能の一部を持つlist_iterator_base、次にを継承したlist_iteratorがあります。ポイントは? 1つのクラスで簡単に突然実行できるようです。

  2. イテレータはiteratorクラスを使用していないようです。それを使用することにいくつかのパフォーマンスのペナルティはありますか?

これらは、私が素早くスキムで見つけた2つの質問です。誰かがSTL実装の実装の根拠を説明する良いリソースを知っていれば、私はそれを聞いてうれしいです。

+0

"ジャンボエビ"。 –

+0

技術的にはSTLと標準ライブラリ(stdlib)は異なっていることに注意してください。後者は、公式言語標準に追加されたときに、ほとんどの場合、前者から派生したものでした。ほとんどの人が "本当の" STLを使用するのではなく、代わりに標準ライブラリ(例えばlibC++)の実装を使用します。多くの人がstdlibをSTLと呼んでいますが、それは通常はうまくいきますが、あなたの質問では区別が意味を変えます。 – GManNickG

+0

@DaveNewtonあなたのご意見は分かりません。 – baruch

答えて

7

答えは単純明快かなりある:

  1. STLは全てジェネリックプログラミングについてです。重要なアイデアは、コードを重複させることではありません。すぐに目標はソースコードが重複しないようにすることですが、判明したようにバイナリコードを複製しないことも意味があります。したがって、STLコンポーネントは一般的に使用されている部品をファクタアウトして使用することがよくあります。リストクラスのリンクや、ベクトルの型に依存しない属性は、ほんの2つの例です。いくつかの部分は型(例えばサイズ)から完全に独立しており、他は型自体(例えばすべてのアクセサ、イテレータなど)を必要とするだけであり、リソースの割り当て(例えば、挿入と破壊は使用されているアロケータについて知る必要がある)に対処するためです。
  2. std::iterator<...>は実際には機能しません。テンプレートパラメータに応じて基本クラスで定義された型は、そのような基底から派生したクラステンプレートに直接アクセスできません。つまり、型は基本クラスで修飾する必要があり、typenameを使用する型としてマークする必要があります。さらに悪いことに、ユーザーは理論的に派生したクラスのオブジェクトを割り当てて、std::iterator<...>へのポインタで解放することができます(これは愚かなことです)。すなわち、有益ではないが、潜在的な欠点がある。すなわち、避けることが最も望ましい。

私は、汎用ライブラリを実装する技術をカバーする優れたリソースは認識していません。 STLの実装で適用された詳細の大半は、複数の人が独自に発明したものですが、汎用プログラミングに関する文献はまだ比較的少ないです。私は、STLを記述している論文のいずれも実装技術について実際には議論していないと考えています。通常、設計の詳細に集中しています。非常に少数の人々しかSTLが何であるかを理解していないと考えられるので、STLを実装する方法ではなくSTLの記述に専念する傾向があります。

+0

ポイント2について:それでもうまくいかない場合は、なぜそれを守りますか?なぜ標準ライブラリに追加されたのですか? – baruch

関連する問題