3
  • C++ の STL に代わるものが必要になるのはいつですか?
  • 代替 STL を使用する利点はありますか?
  • あるとすれば、どれをお勧めしますか?

これらの初心者の箇条書きで申し訳ありませんが、さまざまな STL がリンクされた状態で出荷される多くの製品を目にし、そのようなものがいつ役立つのか疑問に思っていました。

4

3 に答える 3

8

STLの代替ではなく、STLの代替実装について話していると思います。

コンパイラが提供するデフォルトの実装ではなく、サードパーティの STL 実装を使用する理由はいくつかあります。

  1. 一貫性 - 複数のコンパイラを使用していて、各プラットフォームで同じ動作が得られるようにしたい場合があります。

  2. 速度 - 実装は、コンパイラによって提供される実装よりも効率的である場合があります。

  3. 完全性 - コンパイラのデフォルト ライブラリは、STL 機能の完全な補完を提供しない場合があります。(これは、古いコンパイラ、組み込みシステム用のコンパイラ、または C++11 機能用のコンパイラのみの場合があります)。

  4. 追加機能 - STL の一部の実装では、無効な反復子のデバッグの改善などの機能が提供されますが、これはコンパイラの実装には含まれていない場合があります。

明らかに、これらすべてがすべてのコンパイラに当てはまるわけではありません..しかし、サードパーティの STL が役立つ場合もあります。

実装に関しては、ここでリストを見つけることができます

于 2012-08-02T02:11:42.160 に答える
2

マイケルは良い答えを提供しました-追加するポイントがいくつかあります:

  • 「速度」は、STL 実装 X が STL Y よりも N% 高速であると断言できる直線的なものだけではありません。さまざまな使用シナリオで、速度とメモリ使用量をトレードオフする実装の選択肢があります。たとえば、「短い文字列の最適化」により、非常に短い文字列をヒープ メモリではなく文字列オブジェクトに直接格納できる場合があります。実装によって、現在の容量を超えるコンテナのサイズをどれだけ寛大に変更するかについて、わずかに異なる選択肢がある場合があります。

  • バイナリの相互運用性は重要です。STL X オブジェクトを受け入れるように事前にコンパイルされたライブラリ関数を呼び出す必要がある場合、単純にライブラリをリンクして STL Y の同等物を供給することはできません。リンクしている場合、オブジェクトのバイナリ レイアウトは異なる可能性があります。そうでなく、そのような呼び出しを強制した場合でも、クライアント コードがそれらのオブジェクトに対して実行する操作は、ライブラリ コードが期待または必要とするすべてのものではない可能性があります (つまり、維持されません)。同じ不変量)。

  • スレッド セーフは「追加機能」の注目すべき例です。たとえば、多くの初期の STL には Copy-on-Write 文字列の実装でエラーがありました。

于 2012-08-02T02:54:50.267 に答える
0

別のポイント: 一部の STL 実装では、C++ 例外の代わりにカスタム グローバル エラー ハンドラーを使用して、例外の使用を無効にすることができます。これは今日ではあまり重要ではありませんが、長い間、多くのシステムがさまざまな理由で例外を無効にしており、例外が推奨されていない、または完全にサポートされていない例外的なシステムがまだいくつかあります。

于 2012-08-02T02:59:06.743 に答える