1

私は C と C++ の内容を読み、なぜ C が C++ よりも好まれるのかを読みましたが、C++ コンパイラでコンパイルされた C コードを記述し、組み込みプログラムで使用することの影響は何でしょうか。null ポインターなどの標準定義にはいくつかの違いがあるかもしれません。

わかりやすくするために、c コードのみで embedded.cpp を作成し、c++ コンパイラでコンパイルすると、結果のコードは embedded.c コードと同じくらい効率的になります。私の推測では、C コンパイラは高度に最適化されており、最適化されたコードを生成します。それがすべての理由ですか?

4

4 に答える 4

7

比較は、特定のコンパイラを調べている場合にのみ意味があります。一部の主要なコンパイラは、C++ と C の両方でまったく同じバックエンドを使用しており、ライブラリの選択 (ディスク フットプリント、メモリ フットプリント、起動時間、およびその他のほとんどすべてに影響を与えます) は、C と C のみよりもはるかに細かく、非常に自由に決定されます。あなたが本当に気にしていると仮定すると、C++。

その場合、答えは、いいえ、ファイル拡張子は関係ありません。しかし、C プログラムを C と呼ぶことは、チーム内で理解されるように製品を C に限定するという決定を下すのに非常に役立ちます。

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

于 2012-05-13T21:47:07.483 に答える
2

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

C は、より単純なランタイム環境 (crt0 およびクリーンな初期状態) を必要とし、ほぼすべてのプラットフォームで使用できるはずです。

この決定は、OS、libstdc++、またはツールチェーンからの c++ サポートが制限されているプラ​​ットフォームで作業している (または開発している) 場合にのみ重要です。

ちなみに、最新の C および C++ コンパイラは、ほとんどの状況で同等に最適化されたコードを生成できると思います。

于 2012-05-13T23:35:18.353 に答える
1

C++ コンパイラでコードをコンパイルする場合、そのコードは定義上、有効な C コードであっても C ではなく C++ コードです。

一部の有効な C コードは有効な C++ コードではなく、特に C99 固有の機能に当てはまります。また、両方で有効な一部のコードは、セマンティクスがわずかに異なる場合があります (const例: の意味)。ただし、ほとんどの場合、これは生成されたコードまたはそのパフォーマンスにほとんどまたはまったく影響を与えません。

通常、同じコンパイラ スイートを使用して同じコードを C と C++ でコンパイルしても、現実的に測定可能なパフォーマンスの違いは見られません。C++ のランタイム起動はわずかに異なり、main(); の前にグローバルな静的オブジェクトのコンストラクターを呼び出す必要があります。ただし、C++ コードも有効な C の場合、コンストラクターがないため、オーバーヘッドはありません。

C++ にはより厳密な型合意要件とより強力なエラー チェックがあります。有効なコードとは何かについての許容度がいくぶん低くなります。一般に、C コードがエラーや警告なしで C++ としてコンパイルされる場合は、おそらくより優れた/よりクリーンなコードです。いくつかの例外があります。たとえば、C では一般に、からの戻り値を明示的にキャストすることは推奨されません。malloc()、しかしC++では選択の余地がなく、暗黙の関数宣言が必要ないため、Cでそうしないという議論は成立しません。したがって、この場合、C コードを有効な C++ にするには、C では有効であるが悪い習慣と見なされるような方法でコードを記述する必要があります。個人的には、プロトタイプの欠落に関する C コンパイラの警告を抑制または無視すると、どのような場合でも当然の結果が得られるので、C++ との互換性のために C コードを作成することを主張します。

最適化に関しては、同じコンパイラ スイートを使用する場合、C コンパイラでの最適化は、正確なセマンティクスが異なるいくつかのケースを除いて、C++ コンパイラでの最適化とほぼ同じです。

さらに、有効な C である C++ コードを使用すると、C++ の多くの利点が失われます。むしろ、多くの C++ 固有の機能を、実行時のコストをほとんど、またはまったくかけずに利用できます。一方、一部の機能は比較的高価です。使用する前に、特定のターゲットとアプリケーションで実行可能な機能を確認してください。別の質問に役立つリソースをいくつかリストしました。

于 2012-05-14T14:44:51.933 に答える
0

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

また、アプリが単なるCコードの場合は、throw()で使用するすべての関数プロトタイプを装飾する必要があります。そうしないと、C ++コンパイラは、呼び出すすべての関数がスローされ、最適ではないコードを生成できると想定します。

于 2012-05-14T08:36:59.367 に答える