5

STL 実装 (SGI、STLport、libc++) のいくつかのソースを調べていたところ、すべてまたはほとんどの実装に共通すると思われる設計パターンがいくつか見られましたが、その理由は見つかりませんでした。私は良い反響があるに違いないと思います、そしてそれが何であるかを知りたいです:

  1. vectorなどを含め、多くのクラスlist_iteratorが 2 つのクラスとして実装されました。たとえばlist_iterator_base、機能の一部が実装され、インターフェイスの残りの部分がlist_iterator継承されます。list_iterator_baseポイントは?1つのクラスで簡単に実行できるようです。

  2. iteratorイテレータはクラスを利用していないようです。それを使用するとパフォーマンスが低下しますか?

これらは、簡単なスキムで見つけた2つの質問です。STL 実装の実装原理を説明する優れたリソースを誰かが知っている場合は、喜んでお知らせします。

4

1 に答える 1

7

答えはかなり簡単です。

  1. STL はジェネリック プログラミングに関するものです。重要なアイデアは、コードを重複させないことです。当面の目標は、ソース コードを複製しないことですが、バイナリ コードを複製しないことも理にかなっていることがわかりました。このように、STL コンポーネントはよく使用される部分を切り出して使用することが非常に一般的です。リスト クラスのリンクまたはベクターの型に依存しない属性は、2 つの例にすぎません。ベクトルの場合、複数の層さえあります。型から完全に独立している部分 (サイズなど) もあれば、型自体のみが必要な部分 (すべてのアクセサー、イテレーターなど) もあり、方法を知る必要がある部分もあります。リソースの割り当てを処理します (たとえば、挿入と破棄では、使用されているアロケーターについて知る必要があります)。
  2. std::iterator<...>それは実際には機能しないことが判明しました: テンプレート パラメーターに依存する基本クラスで定義された型は、そのような基本から派生するクラス テンプレートでは直接アクセスできません。つまり、型は基本クラスで修飾する必要があり、 を使用して型としてマークする必要がありますtypename。さらに悪いことに、ユーザーは理論上、派生クラスのオブジェクトを割り当て、へのポインターを介してそれらを解放することができますstd::iterator<...>(そうです、それはばかげたことです)。つまり、利点はありませんが、潜在的な欠点があります。つまり、回避するのが最善です。

とは言っても、ジェネリック ライブラリを実装する手法をカバーしている優れたリソースを私は知りません。STL 実装に適用される詳細のほとんどは、複数の人々によって独自に発明されましたが、ジェネリック プログラミングに関する文献はまだ比較的少ないです。STL について説明している論文の中で、実際に実装手法について論じているものはないと思います。通常、それらは設計の詳細に集中しています。STL が何であるかを理解している人はほとんどいないことを考えると、作成者が STL の実装方法よりも、STL とは何かを説明することに集中する傾向があることは大きな驚きではありません。

于 2012-11-07T22:13:28.087 に答える