18

私は組み込みシステム用のプログラム、より具体的にはブートローダーを書いています。Cライブラリを使用していくつかのハードウェアコンポーネントと対話し、CまたはC++のいずれかで作成することを選択できます。どちらかを選択する理由はありますか?C ++のオブジェクト指向機能は必要ありませんが、より強力な型システムがあります。プログラムをより堅牢にする他の言語機能を備えているでしょうか?C ++は(常にではありませんが)大きなファームウェアイメージを生成できるため、C++を避ける人もいます。

4

9 に答える 9

29

これは、答えるのに特に簡単な質問ではありません。これは、次のような多くの要因によって異なります。

  • コードをどのようにレイアウトするか。
  • ターゲット(およびブートローダーを使用したい他のターゲット)で使用可能なC++コンパイラがあるかどうか。
  • アプリケーションにとってコードサイズがどれほど重要か(別の回答で示唆されているようにMBではなく、おそらく10%余分に話している)。

個人的には、コードをレイアウトする方法としてクラスが本当に好きです。Cコードを作成する場合でも、メンバー関数を「シミュレート」するファイルスコープ静的関数と(いくつかの)メンバー変数を「シミュレート」するファイルスコープ静的変数を使用して、すべてをモジュラーファイルに保持する傾向があります。そうは言っても、私の既存の組み込みプロジェクトのほとんど(すべてが比較的小規模で、ブートローダーを含めて最大128kBのフラッシュですが、通常はそれ以下です)はCで記述される傾向があります。私は確かにC++への移行を検討しています。

クラスまで行かなくても、参照、オーバーロード、およびテンプレートを使用するだけで、C++にはかなりの利点があります。確かに、動的メモリ割り当て(新規)の使用を含む、より高度な機能の多くを使用することはできません。繰り返しになりますが、可能であれば、組み込みCでの動的メモリ割り当て(mallocなど)も避けたいと思います。

C ++コンパイラを使用している場合(g ++のみの場合でも)、コード内の問題の数を減らすことができるように、追加の型チェックのためだけにコードを実行する価値があります。C ++コンパイラは、静的分析ツールでさえも見つけられないいくつかのことを理解できます。

人々がC++を拒否する多くの無効な理由に関する良い議論については、Embedded.comのDanSaksの記事を参照してください。

于 2009-10-27T08:13:16.350 に答える
11

ブートローダーの場合、特に組み込みシステムでは、当然の選択はCです。生成されたコードは金属に近く、デバッグが非常に簡単である必要があります。おそらくアセンブリにドロップすることで、C++で注意を払わないとすぐに困難になります。また、CツールチェーンはC ++ツールチェーンよりもはるかに普及しているため、ブートローダーをより多くのプラットフォームで使用できます。最後に、生成されたバイナリは通常小さく、Cスタイルで記述された場合に使用するメモリが少なくなります。

于 2009-10-27T08:05:46.020 に答える
10

オブジェクト指向を使用する必要がない場合は、Cを使用します。そこで簡単に選択できます。同じタスクを実行しながら、そのシンプルで簡単です。

いくつかのダイハードは同意しませんが、OOはC ++> Cを作るものであり、多くの状況ではその逆です。

于 2009-10-27T07:06:30.377 に答える
9

C ++を使用する特別な理由がない限り、Cを使用します。ブートローダーの場合、実際にはOOは必要ありません。

仕事を成し遂げる最も簡単なツールを使用してください。

于 2009-10-27T09:16:50.210 に答える
7

Cでプログラムを書くことは、C++で書くことと同じではありません。C ++でのみそれを行う方法を知っている場合は、C++を選択します。ブートローダーを作成するには、コードを最小限に抑える方がよいため、おそらく標準C++ライブラリを無効にする必要があります。Cで書く方法を知っているなら、Cを使うべきです—それはそのような種類のタスクのためのより一般的な選択です。

于 2009-10-27T07:34:18.137 に答える
4

これまでの回答のほとんどは、ブートローダーが小さくて単純であると想定しています。これは通常の場合です。ただし、より複雑になる場合(つまり、イーサネットポート、USBポート、またはシリアルポートからロードできる必要がある場合...既存のコードを消去する前に、ロードされているコードを検証する必要があります。など)C++を検討することをお勧めします。

また、ブートローダーとアプリケーションは通常、ある程度の共通コードを共有しているため、コード共有を容易にするために、アプリケーションと同じ言語の使用を検討することもできます。

于 2009-10-27T15:33:47.987 に答える
2

C言語は、C++よりも構文解析が大幅に簡単です。これは、有効なCと有効なC ++の両方であるプログラムが、Cプログラムとしてより高速にコンパイルされることを意味します。おそらく大きな懸念事項ではありませんが、C++がおそらくやり過ぎであるもう1つの理由です。

于 2009-10-27T08:06:16.030 に答える
2

C ++を使用して、必要な言語機能をobjchooseします。使用しているC++の抽象化を理解している限り、出力オブジェクトコードを完全に制御できます。

仮想関数の使用を避ければ、OOの使用は引き続き正常に実行できます。std :: stringのように、値を渡すために多くのコピーを必要とする不変のオブジェクトタイプは避けてください。ただし、実行時のパフォーマンスに実際に影響を与えることなく、テンプレートなどの機能を引き続き使用できます。

于 2009-11-05T12:29:09.567 に答える
0

µClibcでCを使用します。これにより、コードが単純になり、フットプリントが削減されます。www.uclibc.orgで見つけることができます。

于 2009-10-27T09:58:05.283 に答える