2012-05-13 18 views
1

私はC対C++のものを読んだが、なぜCがC++よりも好まれているが、C++コンパイラでコンパイルして組み込みプログラムで使用すると、何がNULLポインタなどの標準定義に若干の違いがあるかもしれない。私はCコードでembedded.cppを書いて、C++コンパイラでコンパイルする場合C++コンパイル済みCコードと組み込みプログラミングのPure C?

それをより明確にするために、結果のコードはembedded.cコードほど効率的になります。私の推測では、Cコンパイラは高度に最適化され、最適化されたコードを生成しています。それはすべて理由ですか?

+0

基本的に、コンパイラは最初にコードを中間言語**に変換し、マシンコードの次に置きます。そのため、GCCなどではCとC++で同じ最適化が利用できます。 CコードにC++コンパイラを使用する理由 –

+0

はいCコードのためにC++コンパイラを使用する必要はありません。しかし、ちょうどgccとg ++がまったく同じコードで、組み込みプログラミングのような環境で使用できる同じコードを生成することを知りたかっただけです。 – Dexters

+2

Cで書かれたからといって、もっと効率的であると思う理由はありません.C++で何をするのかは手作業で行う必要があります。 –

答えて

7

比較は、特定のコンパイラを参照している場合にのみ意味があります。いくつかの主要なコンパイラは、C++とCの両方で全く同じバックエンドを使用しており、ライブラリの選択肢(ディスクのフットプリント、メモリフットプリント、起動時間、その他のほとんどすべてに影響を与えます)は、C言語だけでなく、 C++、あなたが本当に気にしているとします。

その場合、答えはいいえ、いいえ、ファイル拡張子は問題になりません。しかし、Cプログラムを呼び出すことは、あなたのチーム内で理解されるようにC言語に限定することを決定するのに非常に良いことです。

組み込み開発のC++に対する多くの議論は、C++コンパイラが言語を正しく実装するのに苦労した時代から、時には予測可能なパフォーマンスやランタイムサイズを犠牲にしてきたことに注意してください。私の近くで戦われている組み込み開発のための今日の実用的な言語戦争は、C++とC#の間にある傾向があり、Cもほとんど記憶されません。

+1

"... Cはめったに記憶されていません" - 正当な理由で) –

+2

私は本当に恐ろしいCコードを製品に見出しています.Cは単純な言語です。 C++プログラマは平均してCプログラマより賢く訓練された人ではなく、C++はC言語よりも複雑です。私の考えはC++コードのようなかなりのCコードが二乗されていることです。あなただけの推測:-) –

+5

組み込みシステムとは何を考えていますか?ノートパソコン?スマートフォン?あなたは、組み込み市場全体のいくつかの奇妙なニッチを見ただけのようです。自動車/産業/医療/航空宇宙産業など、PCのまったく別の味ではない実際の組み込みシステムを見ると、組み込み市場の約90%がCです。その他の10%は主にアセンブラ、C++、ADAですが、アセンブラはまだ3つの中で最大の可能性があります。 C#とJavaは、組み込みシステムでは存在しないものです。 – Lundin

2

C++コンパイラでコードをコンパイルすると、存在しないかもしれないctor/dtorエントリの処理、スタックの巻き戻しなど、環境からのC++ランタイムが予想されます。

Cは、より単純なランタイム環境(にcrt0とクリーンな初期状態)を必要とし、ほぼすべてのプラットフォームで準備する必要があります。

あなたはOS、のlibstdC++、またはツールチェーンから++サポートする、C限られたプラットフォームに取り組んで(または開発)している場合、決定が唯一の問題。ところで

は、私は現代のCおよびC++コンパイラは、ほとんどの状況でも同様に最適化されたコードを生成することができると信じて。

0

C++ランタイムは、起動コストと終了コストが高いです。 C++の機能を使用する必要がない限り、C++ではなく常にCでビルドする必要があります。

また、あなたのアプリが単なるCコードであれば、throw()で使用するすべての関数プロトタイプをデコレートするか、C++コンパイラは呼び出したすべての関数がスローして最適なコードを生成できないとみなします。

+0

そうではありません。私は何年もの間、ベアメタル・エンベデッド・システムでC++を使用してきましたが、多くの場合、ランタイム・スタートアップを実装しなければなりませんでした。唯一の違いは、C++がmain()を入力する前にグローバルな静的オブジェクト*のコンストラクタを呼び出すことです。これは、おそらく初期化であり、いずれにしても、どちらか一方のケースで対応する必要があります。それが起こるのは単なる問題です。そのようなオブジェクトがない場合、オーバーヘッドはありません。たとえば、 – Clifford

+0

の場合、cout、cin、cerrは常に使用するかどうかにかかわらず構築されます。 – pizza

+0

私は違うことを願います。 C++ライブラリがリンクされていない(そして多くの組み込みシステムがC++ライブラリを使用していない)場合、それらはライブラリによって提供され、組み込みではありません。オブジェクトはインスタンス化されません。確かにコードが*唯一の*有効なCなら、iostreamをリンクする必要はありません。 – Clifford

1

あなたがC++コンパイラでコードをコンパイルした場合、そのコードは、それはまた、有効なCのコードであっても、定義C++のコードではないCです。

一部の有効なCコードは有効なC++コードではなく、特にC99固有の機能にも当てはまります。両方で有効なコードのほうがわずかに異なるセマンティクス - たとえばconstの意味です。しかし、ほとんどの場合、これは生成されたコードやそのパフォーマンスにほとんどまたはまったく違いを生じさせません。

あなたは一般的に何も現実的に同じコンパイラスイートを使用して、同じコードのCおよびC++のコンパイルの間に測定可能なパフォーマンスの違いを見ないだろう。 C++は実行時起動がわずかに異なり、main()より前にグローバルな静的オブジェクトのコンストラクタを呼び出す必要があります。しかし、あなたのC++コードも有効なCなら、コンストラクタは存在しないのでオーバーヘッドはありません。

C++ではより厳密な型合意が要求されており、より強力なエラーチェックが行われています。有効なコードは何か許容されません。一般に、Cコードがエラーや警告なしでC++としてコンパイルされる場合は、おそらくより良い/よりクリーンなコードになります。いくつかの例外があります。たとえばC言語では一般的にdiscouraged from explicitly casting the return from malloc()ですが、C++では選択肢がなく、暗黙的な関数宣言は必要ないため、C言語ではそうしないという議論は成立しません。この場合、Cコードを有効なC++にするには、C言語で有効な間に悪い習慣を考慮する方法で記述しなければなりません。個人的には、プロトタイプの欠落に関するCコンパイラの警告を抑止したり無視したりすると、どんな場合でも値するものが得られるはずです。

最適化に関しては、同じコンパイラスイートを使用する場合、Cコンパイラの最適化は、おそらく正確なセマンティクスが異なる場合を除いて、C++コンパイラの最適化と同じである可能性があります。

それ以外では、有効なC言語であるC++コードを使用すると、C++の多くの利点が失われます。 C++固有の機能の多くは、ランタイムコストがほとんどまたはまったくない場合でも利用できます。一方で、一部の機能は比較的高価です - 特定のターゲットとアプリケーションを使用する前に実行可能な機能があることを確認してください。私はanother questionのそれを助けるかもしれないいくつかのリソースを記載しました。

関連する問題