Jerry氏:...結果はもうC ++ではありませんが、私の比phor は明らかにC ++であり、プログラムが他の形式、規則、書かれたスタイルを利用しているため、わずかに異なる方言であるということです。
これらを無効にする主な理由は次のとおりです。
バイナリ互換性
言語と翻訳の境界を越えることは、普遍的に明確に定義されているわけでも、定義されていないわけでもありません。定義された動作のドメイン内でプログラムが動作することを保証したい場合は、モジュールの出口点で例外を隔離する必要があります。
実行可能サイズ
以下は、例外を有効にした場合と無効にしない場合に作成した、例外を含まないプログラムのバイナリサイズです。
例外なし:
- 実行可能ファイル+依存関係:330
- 最終的なストリップされた実行可能ファイル(リリースビルド):37
例外あり:
- 実行可能ファイル+依存関係:380
- 最終的なストリップされた実行可能ファイル(リリースビルド):44
注意:これは、ゼロスロー/キャッチを含むライブラリとプログラムのコレクションです。コンパイラフラグは、C ++標準ライブラリの例外を有効にします。したがって、この例では、実際のコストは19%以上です。
コンパイラ:apple gcc4.2 + llvm。MB単位のサイズ。
速度
「ゼロコストの例外」という用語にもかかわらず、何もスローされない場合でもオーバーヘッドが追加されます。上記の場合、パフォーマンスが重要なプログラム(信号処理、生成、プレゼンテーション、変換、大きなデータセット/信号など)です。この設計では例外は必要な機能ではありませんが、パフォーマンスは非常に重要です。
プログラムの正確さ
奇妙な理由のようです...投げることがオプションではない場合は、プログラムが正しく実行され、クライアントがインターフェイスを正しく使用することを保証するために、比較的厳密で正しい、十分にテストされたプログラムを作成する必要がありますエラーコードをチェックしないでください、そしてあなたはUBに値する)。結果?実装の品質が大幅に向上し、問題が迅速に修正されます。
シンプルさ
例外処理の実装は、常に最新の状態に保たれていません。また、実装は非常に多くの終了シーケンスを持つことができるため、非常に複雑になります。明確に定義され、型付けされた少数の出口戦略を使用する非常に複雑なプログラムを読み、維持する方が簡単です。他の場合では、実装が時間とともにより多くのスローを実装するか、それらの依存関係がそれらを導入する場合があります。クライアントは、これらすべての出口を簡単または適切に防御することはできません。私は多くのライブラリを書いて更新していますが、頻繁に進化と改善が行われています。すべてを例外終了シーケンス(大規模なコードベース内)と同期させようとすると、時間を有効に活用できず、多くのノイズと問題が発生する可能性があります。プログラムの正確性の向上とテストの増加により、
履歴/既存のコード
場合によっては、歴史的な理由で導入されなかったことがあります。既存のコードベースではそれらを使用していなかったため、プログラムの変更には数年かかる可能性があり、規約と実装が重複しているため、維持するのが非常に面倒になります。
欠点
もちろん、欠点もあります。最大のものは、他のライブラリとの非互換性(バイナリを含む)、およびこのモデルに適合するために大量のプログラムを実装する必要があるという事実です。