2016-04-30 3 views
7

非常にポータブルな使い方であれば、標準ライブラリはほとんどありません。しかし私はこのアプローチを完全には理解していません。 活発に使用されているC++環境では、標準ライブラリの(ほとんどの場合、すべてではないにしろ)サポートが不足していますか?活発に使用されているC++環境では、標準ライブラリの(ほとんどの場合、すべてではないにしろ)サポートが不足していますか?標準的なライブラリー(例えば、「ニンテンドー3DSのためのgccのXバージョン」)はありませんそのため、特定のC++の環境(コンパイラ、OSの、ハードウェア、など)</p> <p>目指すなどBOX2DやTinyXML2のようないくつかのC++のライブラリを探してい

+1

人々は時々STLを避けます。真http://stackoverflow.com/questions/2226252/embedded-c-to-use-stl-or-not – computerfreaker

+0

@computerfreaker、私は*サポート*組み込みシステムに目指すライブラリが心配だけど、ではない:関連サポートデスクトッププラットフォームやそれに類するものの犠牲になる。 – JesseTG

+0

ゲーム業界は、ヒープ割り当てによって引き起こされるパフォーマンスの低下について懸念しています。彼らはしばしば標準ライブラリの使用を避けます。そして、ここでは、参照カウントのための共有ポインタの1つの割り当てのような小さなオーバーヘッドについて説明しています。 – Alex

答えて

-3

簡易返答は、STLパッケージを含まないことを選択した場合に表示されます。

ほとんどのIDEでは、プロジェクトに#include <package_name>のSTLを呼び出す項目がない場合、STLはコンパイル時には含まれません。

あなたが特にIDE /コンパイラSTLを回避するための大きな理由の

一つを通じてSTLを除外しなければならない場合があるかもしれないが

は、最終的なコンパイル済みのファイルサイズを小さくすることです。

+1

私は標準ライブラリ(例えば、「ニンテンドー3DSのためのgccのXバージョン」)はありませんそのため、特定のC++の環境(コンパイラ、OSの、ハードウェア、など)について尋ねています。 – JesseTG

5

C++標準ライブラリのサポートは、さまざまなコンパイラベンダーによって異なりますが、同じコンパイラの異なるバージョン間でも異なります。これは、組み込みシステムやさまざまなコンソールで特に当てはまります。

「変化する」とは、バグ、機能の実装方法が異なること、機能が不足している可能性があることを意味します。たとえば、Androidには非常にminimalのC++標準ライブラリが実装されています。

多くの奇妙で素晴らしいC++コンパイラがあります。それはGCCとVisual Studioだけではありません。たとえば、任天堂はGreen Hillsコンパイラを使用しています。

さまざまなコンパイラがあるため、多数のコンパイラをサポートする最も良い方法は、C標準ライブラリが提供する機能だけに固執することです。多くのポータブルライブラリは、より現代的なC++機能の使用を避けています。

1

私が考えることができる唯一の環境は、フリースタンディングなもの(オペレーティングシステムとシングルプロセス組み込みプログラム)です。もちろん、一部の開発者は積極的にSTLの使用を避けますが、これは環境上のサポートの欠如よりも設計上の決定です。私は、これらの制限された環境における最大のハードルは、例外サポート(多くのSTL関数が投げる)であると信じています。これらをサポートするには、C++のABIを移植してライブラリをunwindする必要があります(スタックの巻き戻しとcatch文への移動を行うため)。これらの必要なビットを実装するのを止めるものは何もありませんが、リンクされたリストのようなものに対する基本的なサポートのためだけに膨らんでいる依存関係が増えています。 ABIを移植するには、the OSDEV wiki entryを参照してください。

新しいC++標準(C++ 11以降)には他にも依存関係があります。私は想像することができますstd::threadは、pthreadsなどのスレッドの実装が必要です。 std::chronoはおそらく、それとCの標準ライブラリ時間の間に実装されたいくつかの中間層を必要とするでしょう。オペレーティングシステムのサポートが必要なSTLの機能が多分あるでしょう。

STLの部分も非常に重要です。テンプレートはしばしば、最終的なバイナリサイズをかなり大きくします。例えば、std::listの場合、std::list<MyClass1>およびstd::list<MyClass2>は、2つの異なる容器の特殊化をもたらす。コードは非常によく似ていますが、具体的に要素タイプを扱うために複製されます。リンクリストの他の実装では、ノードをリンクするためにvoidポインターを使用し、必要に応じて適切なクラスにキャストします。このように、などのintのための1つのインスタンス化されたリストクラス、のchar *、MyClass1が、そこにあるの増加バイナリサイズは、組み込み環境では、多くの場合、受け入れられないが、LIBAがLIBAを実装したときに、それはまた、問題となることに留意しなければならない:: LinkedListのおよびLibB LibB :: LinkedList

実装の品質は、これらの日、問題の少ないなっています。また、GCCは多くのアーキテクチャをターゲットにしているので、新しいコンパイラ標準が利用できるようになります(上記のように、STLの一部の機能を移植する必要があります)。私が使用した最も古いGCCは、GCC v4.3か、それに似たものが組み込まれたPowerPCデバイス用です。これは2010年にリリースされ、完全なSTLサポートを受けました。要約すると

、非常に集中機能が設定されたライブラリの必要性がまだ助けることができますが、彼らはラップOSに依存する動作機能を提供する場合、私の意見では、彼らはどのように多くのプラットフォームプロジェクトの目標に減少。未処理のデータ構造とアルゴリズムのサポートには、間違ってはいけません。最終的には、プラットフォームのいくつかのサブセットをターゲットにする必要があります。 C++ 11では、使用するデスクトップ/サーバーオペレーティングシステムの99%、組み込みLinuxデバイスの99%を対象としています。別の答えで強調されているように、Androidは問題になりましたが、実際に現代的な環境を得るために必要なすべてのビットを得るためにthis pageが強調表示されているようです。組み込み環境のために設計

関連する問題