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++ 固有の機能を、実行時のコストをほとんど、またはまったくかけずに利用できます。一方、一部の機能は比較的高価です。使用する前に、特定のターゲットとアプリケーションで実行可能な機能を確認してください。別の質問に役立つリソースをいくつかリストしました。