古い質問ですが、検索エンジンでこの質問を見つけたのはおそらく私だけではないので、ここに 5 セントを追加したいと思います。
コンパイル速度についてはコメントできませんが、実行速度についてはコメントできません。
私の知る限り、C++ には、使用しなくてもパフォーマンスを犠牲にする機能が 1 つしかありません。noexcept
この機能は、いくつかのコンパイラの最適化を妨げるため、c++ の例外です (これが、 c++11 で導入された理由です)。ただし、何らかのエラー チェック メカニズムを使用する場合は、戻り値のチェックと lotif else
ステートメントを組み合わせるよりも、おそらく例外の方が効率的です。これは、エラーをスタックにエスカレートする必要がある場合に特に当てはまります。
とにかく、コンパイル中に例外をオフにすると、c++ はオーバーヘッドを導入しません。実行時のオーバーヘッドはまったくありません (オーバーロード、テンプレート、名前空間 aso)。一方、c++ にはこれを行うための組み込みメカニズム (テンプレートとクラス) が用意されているため、ほとんどの形式のジェネリック コードは、c の同等のコードよりも c++ の方がはるかに高速です。典型的な例は、c の qsort と c++ の std::sort です。通常、c++ バージョンははるかに高速です。これは、並べ替え内で使用されるコンパレータ関数がコンパイル時に認識されるためです。これにより、少なくとも関数ルックアップによる呼び出しが節約され、最良のケースでは、多くの追加のコンパイラ最適化が可能になります。
そうは言っても、C++ の「問題」は、複雑さをユーザーから隠すのが簡単で、一見無害なコードが予想よりもはるかに遅くなる可能性があることです。これは主に、演算子のオーバーロード、ポリモーフィズム、およびコンストラクター/デストラクターによるものですが、メンバー関数への単純な呼び出しでさえ、this
NOP ではない渡された -pointer を隠します。演算子のオーバーロードを考慮する:*
C では、これは (ほとんどのアーキテクチャで) 単一の安価なアセンブラー命令であることがわかっていますが、C++ では複雑な関数呼び出しになる可能性があります (行列の乗算について考えてみてください)。これは、c で同じ機能をより速く実装できるという意味ではありませんが、c++ では、これが高価な操作である可能性があることを直接確認することはできません。デストラクタも同様のケースです。「最新の」C++ では、delete による明示的な破棄はほとんど見られませんが、スコープ外に出るローカル変数は、これを示す 1 行のコードなしで (仮想) デストラクタへの高価な呼び出しをトリガーする可能性があります。 (無視して}
もちろん)。最後に、一部の人々 (特に Java 出身者) は、多数の仮想関数を含む複雑なクラス階層を記述する傾向があり、そのような関数への各呼び出しは、最適化が困難または不可能な隠れた間接関数呼び出しです。したがって、複雑さをプログラマーから隠すことは一般的には良いことですが、プログラマーがこれらの「使いやすい」構造のコストを認識していない場合、実行時に悪影響を与えることがあります。
要約すると、C++ を使用すると、経験の浅いプログラマーが遅いコードを簡単に記述できるようになります (プログラムの非効率性を直接認識しないため)。しかし、c++ を使用すると、優れたプログラマーは、c よりも速く「優れた」正確で高速なコードを作成できるようになります。これにより、本当に必要なときに最適化について考える時間が増えます。
PS:
私が言及していない 2 つのこと (おそらく単に忘れてしまったものもあります) は、複雑なコンパイル時の計算 (テンプレートと constexpr のおかげ) に対する c++ の機能と、c の restrict キーワードです。これは、どちらもタイムクリティカルなプログラムでまだ使用していないためです。そのため、それらの一般的な有用性と実際のパフォーマンスの利点についてコメントすることはできません.