web-dev-qa-db-ja.com

Embedded C ++:例外を使用するかどうか?

これは主観的なものかもしれないので、具体的な質問をしますが、まず、背景:

私は常に組み込みソフトウェアエンジニアでしたが、通常はOSIスタックのレイヤー3または2にいます。私は実際にはハードウェアの人ではありません。私は通常、テレコム製品、通常は携帯電話/携帯電話を使用してきました。これは通常、ARM 7プロセッサのようなものを意味します。

今、私はより一般的な組み込みの世界、小さなスタートアップで、「それほど強力ではない」プロセッサに移行する可能性があることに気づきました(主観的なビットがあります)-どちらを予測することはできません。

組み込みシステムのC++での例外処理に関する議論についてはかなり読んだことがありますが、明確な答えはありません。移植性についての小さな心配と実行時についてのいくつかの小さな心配がありますが、それは主にコードサイズに帰着するようです(または私は間違った議論を読んでいますか?)。

今、私は例外処理を使用するか、または放棄するかを決定する必要があります-会社全体で、永遠に(それはいくつかの非常にコアなソフトウェアになります)。

それは「弦の長さ」のように聞こえるかもしれませんが、誰かが「あなたの弦が8051の場合、そうではありません。OTOHの場合は...」と答える可能性があります。

どちらにジャンプしますか?超安全で優れた機能や例外的なコードを失い、後で問題が発生する可能性がありますか?

パフォーマンスの観点から、私の理解では、例外は実際にはサイズを減らし、コードのnormal実行パスのパフォーマンスを向上させますが、例外/エラーを引き起こしますより高価なパス。 (多くの場合、lotより高価です)。

したがって、パフォーマンスだけが懸念される場合は、後で心配する必要はありません。今日のCPUがそれを処理できれば、明日も処理できます。

ただし。私の意見では、例外は、プログラマーが合理的に期待できるよりも常に賢い必要がある機能の1つです。だから私は言う-あなたができれば例外ベースのコードから離れてください。近づかないでください。

Raymond Chenの よりクリーンで、よりエレガントで、認識しにくい をご覧ください。彼は私よりもいいと言っています。

20
John Knoeller

例外に関する最も問題は、予測可能な実行時間がないことです。したがって、これらはハードリアルタイムアプリケーションには適していません(ほとんどの組み込みアプリケーションはこのカテゴリに分類されないと思います)。

2つ目は、(可能性のある)バイナリのサイズの増加です。

C++パフォーマンスに関するテクニカルレポート を読むことをお勧めします。これは、特に関心のあるトピックに対応しています。組み込み(ハードリアルタイムシステムを含む)でのC++の使用、および例外処理の通常の実装方法とオーバーヘッドあります。

10

例外を使用するかどうかの選択は、例外がプログラムの問題ドメインにうまく適合するかどうかにかかっているはずです。

私は、古いCコードへの改良といくつかの新しいコードの両方で、C++例外を広範囲に使用しました。 (ヒント:あらゆる種類の一貫性のない例外を除いて、低メモリ環境で記述された20年前のCコードを再適合させようとしないでください。これは単なる悪夢です)。

問題がすべてのエラーを1か所で処理するのに役立つ問題である場合(たとえば、すべてのエラー条件が「接続を切断して再試行する」で満たされる、ある種のTCP/IPサーバー)、例外は適切です。 -どこでも例外をスローでき、どこでどのように処理されるかがわかります。

一方、問題が中央のエラー処理に適していない場合、例外は非常に苦痛です。何かが処理されている(または処理されるべき)場所を見つけようとすると、簡単にシーシュポスのタスクになる可能性があるためです。そして、コードを見ただけでは問題を見つけるのは本当に難しいです。代わりに、問題があるかどうかを判断するために、特定の関数の呼び出しツリーを調べて、その関数の例外がどこで発生するかを確認する必要があります。

9
Michael Kohne

ランタイム環境で例外がサポートされている場合は、例外を適切に使用すると思います。異常な状態を処理するための例外は問題なく、実装によってはほとんどオーバーヘッドが発生しない可能性があります。一部の環境は、特に組み込みの世界では、それらをサポートしていません。それらを禁止する場合は、その理由を注意深く説明してください。私にはかつて、例外を使用しないように言われたときに、代わりにゼロ除算を行う人がいました。正確には私たちが考えていたものではありません。

4