一部の分野(ゲーム業界など)では、STLはお勧めできません。だから私の質問は次のとおりです:場合によってはSTLを使用しないことは本当に良い習慣ですか?もしそうなら、最新のC ++のSTLを使用しない最大の理由は何ですか?
一部の分野(ゲーム業界など)では、STLはお勧めできません。だから私の質問は次のとおりです:場合によってはSTLを使用しないことは本当に良い習慣ですか?もしそうなら、最新のC ++のSTLを使用しない最大の理由は何ですか?
回答:
正当な理由は1つしか考えられませんが、それは非常にまれです:ハードリアルタイム。標準ライブラリの多くの要素は内部的にメモリを割り当てますが、ハードリアルタイムアプリケーションには決定論的ではないため、それらを避ける必要があります。これらのアプリケーションは通常非常に単純ですが、非常に厳密なレビューとテストのために開発に不均衡な時間がかかります。
1つの無効な、しかし非常に一般的な理由を考えることができます:計算の複雑さを理解せず、STLを誤用してライブラリを非難する開発者。
STLは通常、コールバックポインターを使用したCスタイルソリューションまたは仮想メソッドを使用したポリモーフィズムベースのソリューションよりも実行時に高速です(このBjarne Stroustrupの基調講演も参照してください)。ただし、開発者が与えられた複雑さの仕様を理解せず、いくつかの複雑なオブジェクトのベクトルのベクトルのようなものを作成してライブラリを誤用すると(C ++ 11では問題になりません!)、パフォーマンスの問題を引き起こし、自分自身を守るよりも「おわかりのように、ベクトルはかなり遅い」と、標準ライブラリが遅いという認識を引き起こす可能性があります。そして、マネージャーがそのような認識を得ると、組織内で非常に長く生きることができます。
明らかに、ターゲットとしているプラットフォームがサポートしていないものは使用できません。ただし、現在最も一般的な4つのモバイルプラットフォーム(Android、iOS、Bada、および古いWinCE)を対象としており、それらすべてで標準ライブラリとBoostの一部を使用しています。
標準ライブラリの多くは、WinCEの初期段階でMicrosoftによってサポートされていませんでした(IIRC iostreamはVisual Studio 2005でのみ登場しました)が、その前にSTLportを使用することは可能でした。そして、通常は何でもコンパイルすることができます。したがって、この理由も無効だと思います。
その上、かなり長い間「STL」ではなく、ANSI C ++標準ライブラリです。言語自体を定義する非常に同じ標準文書によって定義されます。それをサポートしていないものは、実際にはC ++と呼ぶに値しません。
sprintf
多くの場合、メモリも割り当てます。リアルタイムプラットフォームでは、標準ライブラリ関数にも確定的な制限があります。これにより、リアルタイムC ++の実装が難しくなります。C++標準ライブラリ全体を慎重に開発する必要があります。これは、小さなC標準ライブラリよりも多くの作業です。
私はすでにSTLとブーストを長年使用しています。放棄してカスタムツールを使用する場合、その動機は次のようになります。
C ++標準テンプレートライブラリを使用しない大きな正当な理由が1つあります。ターゲットプラットフォームの1つに完全に準拠した実装がない(または実装されていない)ため、1つが取得されないことがわかります。数年以内に。
複雑さ(実装の効率)については知りませんが、stdの代わりにQtコンテナと文字列を広範囲に使用していますが、それらは正常に動作します。また、セットとリストのQt実装の方が使いやすいと感じています。
したがって、ニーズに合った別のライブラリを使用できる場合は、STLを放棄することが実用的です。
QList<T>::iterator
そうする大きな理由がない限り、実用的ではありません。私が考えることができるそのような理由の一部には、STL(または標準ライブラリの他の部分)の実装の一部または欠如のみ、または回避する必要があるリソース制限(メモリ、CPU速度、ストレージなど)が含まれます達成する必要があるものに準拠する独自のツールを展開します。
ゲーム業界では、ほとんどのスタジオ(ある程度小さい場合でも)には、ターゲットプラットフォームや場合によってはターゲットゲームやゲーム自体に合わせて調整された多くの標準ライブラリパーツの内部ライブラリと実装があります。コンソール用のゲームを開発する場合、ハードウェアは今日の標準によって非常に制限されています。数千の手作りのアセンブリのラインが理由であります。コード内のあらゆる種類のリソースフットプリントを最小限に抑えることが非常に重要です。これにより、ゲームがより速く実行され、ゲームの世界(たとえば、より大きな世界)でより多くのコンテンツが可能になり、より良い製品ができます。
「成功するゲームはすべて、独自のリンクリストの実装を展開することから始まります。」