8

これが有効な比較であるか有効なステートメントであるかはわかりませんが、C++ で記述されたプログラムは一般に C で記述されたプログラムよりもコンパイルに時間がかかり、C++ でコーディングされたアプリケーションは一般に、C で記述されたものよりも実行時に遅くなります。
これらのステートメントには真実がありますか?
C++ が提供する OOP の柔軟性のメリットを享受することは別として、上記の比較は純粋にコンパイル/実行時間の観点から考慮すべきでしょうか?

これが一般的または漠然としすぎて閉じられないことを願っています。これは、私が長年にわたって多くのプログラマー (主に C プログラマー) から聞いてきたステートメントについて、実際の事実を知ろうとする試みにすぎません。

4

6 に答える 6

11

かなり客観的な質問の特定の部分に答えます。テンプレートを使用するC++コードは、Cコードよりもコンパイルに時間がかかります。テンプレートを使用しない場合(標準ライブラリを使用する場合はおそらく使用します)、コンパイル時間は非常に似ているはずです。

編集:実行時間に関しては、はるかに主観的です。Cはやや低水準の言語かもしれませんが、C ++オプティマイザーは非常に優れており、C++は現実世界の概念をより自然に表現するのに役立ちます。要件をコードで表現する方が簡単な場合(C ++で議論するように)、他の言語よりも優れた(そしてよりパフォーマンスの高い)コードを作成する方が簡単な場合がよくあります。考えられるすべてのケースでCまたはC++の方が高速であることを示す客観的なデータはないと思います。私は実際にプロジェクトのニーズに基づいてあなたの言語を選び、それをその言語で書くことを提案します。物事が遅すぎる場合は、プロファイルを作成し、通常のパフォーマンス改善手法を実行します。

于 2011-03-24T14:30:29.327 に答える
10

相対的な実行速度は、予測するのが少し難しいです。ほとんどの人が C++ はすべて継承に関するものだと考え、仮想関数を(特に適切でなくても)多用していた当時、C++ で記述されたコードは通常、同等の C よりも少し遅くなりました。

(私たちのほとんどが考えていることですが) 最新の C++ では、その逆の傾向があります。テンプレートを使用すると、コンパイル時の柔軟性が十分に高まり、C で同等の妥当なコードよりも著しく高速なコードを頻繁に生成できます。理論的には、それを常に回避できます。テンプレートを「展開」した結果と同等の特殊なコードを書くことによって - しかし実際には、そうすることは非常にまれであり、非常に高価です.

C++ についても、やや一般的に書かれる傾向があります。たとえば、std::stringor std::vector(or std::vector<std::string>) にデータを読み込むことで、ユーザーはバッファ オーバーフローなしに任意の量のデータを入力したり、データが単純に切り捨てられたりします。点。C では、誰かが固定サイズのバッファーをコーディングするだけでよく見られます。それ以上のサイズを入力すると、オーバーフローするか、切り捨てられます。明らかに、そのために何かを支払う必要があります。通常、C++ コードは最終的に動的割り当て ( new) を使用することになりますが、これは通常、単に配列を定義するよりも低速です。OTOH、同じことを達成するために C を書くと、多くの余分なコードを書くことになり、通常は C++ バージョンとほぼ同じ速度で実行されます。

言い換えれば、ベンチマークや使い捨てユーティリティなどで著しく高速な C を書くのは非常に簡単ですが、堅牢でなければならない実際のコードでは、速度の利点は消えてしまいます。後者の場合、通常期待できる最善のことは、C コードが C++ バージョンと同等であることであり、正直なところ、それをうまく行うことはかなり珍しいことです (少なくとも IME では)。

コンパイル速度の比較は簡単ではありません。一方では、テンプレートが遅くなる可能性があることは絶対に真実です。少なくともほとんどのコンパイラでは、テンプレートのインスタンス化にはかなりのコストがかかります。行単位で見ると、C はほとんどの場合、テンプレートを多用する C++ のどの言語よりも高速であることに疑いの余地はありません。それに関する問題は、行ごとの比較がほとんど意味をなさないことです.C++の10行は、Cの数百または数千行に相当する可能性があります.コンパイル時間だけを見る限り(開発時間ではありません) )、いずれにせよ、バランスはおそらく C に有利ですが、最初にそう思われるほど劇的なマージンではないことは確かです。これもコンパイラに大きく依存します。たとえば、clang は多くのことを行います。この点では gcc よりも優れています (また、gcc はここ数年で大幅に改善されました)。

于 2011-03-24T15:58:17.490 に答える
6

特定の C++ 固有の機能を使用する場合にのみ、C++ と C の実行時間に問題が生じます。例外と仮想関数呼び出しは、エラー コードと直接呼び出しを返す場合と比較して、実行時間が長くなります。一方、C で関数ポインターを使用していることに気付いた場合 (たとえば、GTK が使用しているように)、既に仮想関数の代償の少なくとも一部を支払っています。また、各関数が戻るたびにエラー コードをチェックするのにも時間がかかります。例外を使用する場合はそうしません。

一方、C++ のインライン化とテンプレートを使用すると、コンパイル時に多くの作業を行うことができます。これは、C が実行時に行う作業です。場合によっては、C++ が C よりも高速になることがあります。

于 2011-03-24T14:36:07.550 に答える
5

C および C++ と同じコードをコンパイルする場合、違いはありません。

テンプレートの展開などの作業をコンパイラに任せると、時間がかかります。C でカット アンド ペーストまたはいくつかの複雑なマクロを使用して同じことを行うと、代わりに時間がかかります

場合によっては、テンプレートをインライン展開すると、実際には同等の C コードよりも特化したコードになり、実行速度が速くなります。ここみたいに:

http://www2.research.att.com/~bs/new_learning.pdf

または、このレポートは、多くの C++ 機能にランタイム コストがないことを示しています。

http://www.open-std.org/jtc1/sc22/wg21/docs/TR18015.pdf

于 2011-03-24T14:47:33.383 に答える
4

古い質問ですが、検索エンジンでこの質問を見つけたのはおそらく私だけではないので、ここに 5 セントを追加したいと思います。

コンパイル速度についてはコメントできませんが、実行速度についてはコメントできません。

私の知る限り、C++ には、使用しなくてもパフォーマンスを犠牲にする機能が 1 つしかありません。noexceptこの機能は、いくつかのコンパイラの最適化を妨げるため、c++ の例外です (これが、 c++11 で導入された理由です)。ただし、何らかのエラー チェック メカニズムを使用する場合は、戻り値のチェックと lotif elseステートメントを組み合わせるよりも、おそらく例外の方が効率的です。これは、エラーをスタックにエスカレートする必要がある場合に特に当てはまります。

とにかく、コンパイル中に例外をオフにすると、c++ はオーバーヘッドを導入しません。実行時のオーバーヘッドはまったくありません (オーバーロード、テンプレート、名前空間 aso)。一方、c++ にはこれを行うための組み込みメカニズム (テンプレートとクラス) が用意されているため、ほとんどの形式のジェネリック コードは、c の同等のコードよりも c++ の方がはるかに高速です。典型的な例は、c の qsort と c++ の std::sort です。通常、c++ バージョンははるかに高速です。これは、並べ替え内で使用されるコンパレータ関数がコンパイル時に認識されるためです。これにより、少なくとも関数ルックアップによる呼び出しが節約され、最良のケースでは、多くの追加のコンパイラ最適化が可能になります。

そうは言っても、C++ の「問題」は、複雑さをユーザーから隠すのが簡単で、一見無害なコードが予想よりもはるかに遅くなる可能性があることです。これは主に、演算子のオーバーロード、ポリモーフィズム、およびコンストラクター/デストラクターによるものですが、メンバー関数への単純な呼び出しでさえ、thisNOP ではない渡された -pointer を隠します。演算子のオーバーロードを考慮する:*C では、これは (ほとんどのアーキテクチャで) 単一の安価なアセンブラー命令であることがわかっていますが、C++ では複雑な関数呼び出しになる可能性があります (行列の乗算について考えてみてください)。これは、c で同じ機能をより速く実装できるという意味ではありませんが、c++ では、これが高価な操作である可能性があることを直接確認することはできません。デストラクタも同様のケースです。「最新の」C++ では、delete による明示的な破棄はほとんど見られませんが、スコープ外に出るローカル変数は、これを示す 1 行のコードなしで (仮想) デストラクタへの高価な呼び出しをトリガーする可能性があります。 (無視して}もちろん)。最後に、一部の人々 (特に Java 出身者) は、多数の仮想関数を含む複雑なクラス階層を記述する傾向があり、そのような関数への各呼び出しは、最適化が困難または不可能な隠れた間接関数呼び出しです。したがって、複雑さをプログラマーから隠すことは一般的には良いことですが、プログラマーがこれらの「使いやすい」構造のコストを認識していない場合、実行時に悪影響を与えることがあります。

要約すると、C++ を使用すると、経験の浅いプログラマーが遅いコードを簡単に記述できるようになります (プログラムの非効率性を直接認識しないため)。しかし、c++ を使用すると、優れたプログラマーは、c よりも速く「優れた」正確で高速なコードを作成できるようになります。これにより、本当に必要なときに最適化について考える時間が増えます。

PS:
私が言及していない 2 つのこと (おそらく単に忘れてしまったものもあります) は、複雑なコンパイル時の計算 (テンプレートと constexpr のおかげ) に対する c++ の機能と、c の restrict キーワードです。これは、どちらもタイムクリティカルなプログラムでまだ使用していないためです。そのため、それらの一般的な有用性と実際のパフォーマンスの利点についてコメントすることはできません.

于 2014-05-16T14:50:22.433 に答える
-1

Cアプリケーションは、C++アプリケーションよりもコンパイルと実行が高速です。

C ++アプリケーションは一般に実行時に遅く、Cプログラムよりもコンパイルがはるかに遅くなります。

これらのリンクを見てください:

于 2011-03-24T14:30:53.740 に答える