6

ホストされているmbedC ++コンパイラを使用してC++ライブラリをmbedに移植しています。これは、基本的にARMCCであり、実際には変更できない構成になっています。彼らが決定した構成オプションの1つは(何らかの理由で)、例外がサポートされていないことです。したがって、athrowとacatchはコンパイラエラーを生成します。

例外なく標準C++ライブラリをどの程度正確に使用できますか?ライブラリでいくつかのベクトルを使用しています。push_back関数が実際に成功したかどうかはどうすればわかりますか?例外が発生したかどうかを知るための標準的な方法はありますか、exit(1)それとも単に何かをするだけですか?

4

2 に答える 2

3

例外なく標準 C++ ライブラリをどの程度正確に使用できますか? ライブラリでいくつかのベクターを使用しています。push_back 関数が実際に成功したかどうかを知るにはどうすればよいですか? 例外が発生したかどうかを知る標準的な方法はありますか、それとも exit(1) か何かを実行するだけですか?

C++ で例外処理を無効にすると、非常に制限の厳しい領域に足を踏み入れることになります。

Dinkumware のような一部の標準ライブラリの実装では、例外を無効にすることができます。そこでは、マクロ _HAS_EXCEPTIONS を 0 として定義することが問題です。STLPort には、_STLP_USE_EXCEPTIONS=0 と同様の規則があります。

ただし、例外が無効になっているときに標準ライブラリが何をすべきかについての標準的な定義はありません。ほとんどの場合、例外処理は C++ 言語にかなり根付いています。Evendynamic_castoperator new/new[]throw はデフォルトであり、それらはライブラリ機能ではありません。

また、スローしない標準ライブラリの実装でさえ、何が起こるべきかについての明確な定義が欠けています。シーケンスにさらにメモリを割り当てるプロセスでシーケンスpush_backがスローされた場合、どうすればよいでしょうか? 要素が挿入されていないだけですか?これらのシーケンスの標準インターフェースは、そのようなエラーがいつ発生するかについては何も教えてくれません。

さらに、一般に多くの C++ ライブラリは、演算子 new のようにスローする関数を使用します (nothrow バージョンではありません)。その結果、例外を無効にすると、多くの未定義の動作領域に足を踏み入れることになります。

私はかつて、例外処理を禁止する会社で働かなければなりませんでした。なぜなら、担当のシニア プログラマーは、C を好み、C++ はひどく非効率的であると考えていた時期尚早のオプティマイザーだったからです (偶然にも、彼らはチームで最も非効率的なコードのいくつかを強い好みで書いていました)。リンクされたリストをデフォルトのコンテナーとして使用すると、プロファイリングのホットスポットが左右に表示され、すべてに対して割り当て/割り当て解除される非常に多くの小さなノードが発生しますが、それは別の話です)。

組み込みシステムでは、例外処理に対する反対意見が少し強いかもしれませんが、例外処理なしで一般的に C++ に依存することは難しくなります。例外処理なしでできる最善の方法は、特定の標準ライブラリベンダーに固有の回避策やトリックを見つけるために多くの時間を投資したくない場合を除き、スローする多くの標準ライブラリパーツなしで不自由な形式の C++ を受け入れることだと思いますそれは価値があるよりも面倒かもしれません。

于 2012-03-04T10:20:15.977 に答える
2

彼らは、ここでサポートされていない理由を説明しています:

従来の知恵 (および armcc コンパイラ担当者からのアドバイス) は、例外のオーバーヘッドがかなり高く、したがってこの種のドメインには適していないというものです。そのため、現時点では例外をサポートしていません (サポートを削除するのは困難ですが、追加するのは簡単です)。

ある時点で空間と時間のオーバーヘッドを本当に理解することを確実に検討します (mbed は実際には慣習的ではないため、おそらく例外は完璧です!) が、今のところ、より慣習的な例外処理アプローチに固執する必要があります。

そしてここに

コンパイラでの例外処理はサポートしておらず、追加する予定もありません。しかし、マイクロコントローラー アプリケーションで通常どのように使用しているか、または経験を聞かせていただければ幸いです。しかし今のところ、より標準的な C ソリューションに目を向ける必要があります。

これに基づいて、例外的な状況がstd::terminate().

例外をサポートしないことは、言語標準に従って C++ で合法的なオプションだとは思いません。したがって、失敗したときに何が起こるかを実験するか、コンパイラの背後にいる人々に尋ねるnew必要があります。push_back()

于 2012-03-04T09:14:33.593 に答える