例外なく標準 C++ ライブラリをどの程度正確に使用できますか? ライブラリでいくつかのベクターを使用しています。push_back 関数が実際に成功したかどうかを知るにはどうすればよいですか? 例外が発生したかどうかを知る標準的な方法はありますか、それとも exit(1) か何かを実行するだけですか?
C++ で例外処理を無効にすると、非常に制限の厳しい領域に足を踏み入れることになります。
Dinkumware のような一部の標準ライブラリの実装では、例外を無効にすることができます。そこでは、マクロ _HAS_EXCEPTIONS を 0 として定義することが問題です。STLPort には、_STLP_USE_EXCEPTIONS=0 と同様の規則があります。
ただし、例外が無効になっているときに標準ライブラリが何をすべきかについての標準的な定義はありません。ほとんどの場合、例外処理は C++ 言語にかなり根付いています。Evendynamic_cast
とoperator new/new[]
throw はデフォルトであり、それらはライブラリ機能ではありません。
また、スローしない標準ライブラリの実装でさえ、何が起こるべきかについての明確な定義が欠けています。シーケンスにさらにメモリを割り当てるプロセスでシーケンスpush_back
がスローされた場合、どうすればよいでしょうか? 要素が挿入されていないだけですか?これらのシーケンスの標準インターフェースは、そのようなエラーがいつ発生するかについては何も教えてくれません。
さらに、一般に多くの C++ ライブラリは、演算子 new のようにスローする関数を使用します (nothrow バージョンではありません)。その結果、例外を無効にすると、多くの未定義の動作領域に足を踏み入れることになります。
私はかつて、例外処理を禁止する会社で働かなければなりませんでした。なぜなら、担当のシニア プログラマーは、C を好み、C++ はひどく非効率的であると考えていた時期尚早のオプティマイザーだったからです (偶然にも、彼らはチームで最も非効率的なコードのいくつかを強い好みで書いていました)。リンクされたリストをデフォルトのコンテナーとして使用すると、プロファイリングのホットスポットが左右に表示され、すべてに対して割り当て/割り当て解除される非常に多くの小さなノードが発生しますが、それは別の話です)。
組み込みシステムでは、例外処理に対する反対意見が少し強いかもしれませんが、例外処理なしで一般的に C++ に依存することは難しくなります。例外処理なしでできる最善の方法は、特定の標準ライブラリベンダーに固有の回避策やトリックを見つけるために多くの時間を投資したくない場合を除き、スローする多くの標準ライブラリパーツなしで不自由な形式の C++ を受け入れることだと思いますそれは価値があるよりも面倒かもしれません。