2009-08-14 8 views
4

私はC++コンパイラでコンパイルされたCコードの一般的なパフォーマンスより多くの議論を見ました - 私はあなたがWebで見つけたすべての逸話的な炎の戦争の下に埋め込まれた頑丈な実験的な研究があるかどうか不思議です検索します。私は特にGCCスイートに興味がありますが、データポイントは興味深いものです。 ( "Hello、World!"のアセンブリを比較することは、私が望むほど頑丈ではありません:-)C++コンパイラを使ったCコンパイルに関する決定的な研究/実験はありますか?

私は、一般的に "組み込みスタイル"フラグを使用していると仮定しています。私はまた、コンパイル時間そのものについての研究があるかどうか分からない。 TIA!

+0

異なるコンパイラを比較しますか?同じコンパイラによるCコンパイルとC++コンパイルの比較(違いがありますか?)そして、 "組み込みスタイル"のフラグは何ですか? –

+0

同じコンパイラスイート(gccとg ++)仕様の相違のために、有用な最適化は、ある言語の仲介表現と他の言語の仲介表現で多かれ少なかれ適用されるかもしれません。例外サポートを無効にするフラグと、RTTIを無効にするフラグの2つの組み込みスタイルフラグについて述べました。 – cdleary

+0

Cのようなコードをコンパイルすると、どちらのフラグもどのように適用されるのかわかりません.PODしかない場合はどこにもデストラクタがないため、例外処理コードは必要ありません。仮想関数はないので、コンパイル時に解決される 'typeid'呼び出しを除いて、RTTIは必要ありません。もしそれらの関数がなければ、何も必要ありません。 –

答えて

1

私は研究を知らないが、使用していない機能については価格を払わないというC++の理念から、Cコードのコンパイルには大きな違いがあるとは思わないCコンパイラとC++コンパイラを使用します。

+0

それは、ほとんどの人が炎戦で言うことです。しかし、lkmlに関する逸話的な証拠もあります。これは、Linuxカーネルがg ++でコンパイルしようとしていて、かなり遅くなってしまったことを示しています。 – cdleary

+0

Linuxカーネルのコンパイルは特殊なケースです。通常のアプリケーションには適用されないスタックサイズやヒープ割り当てなどの制限があります。 – MarkR

+0

C++のLinuxカーネルでは、それは減速だけではありませんでした。メモリを管理するのが難しく、カーネル内の例外処理全体が文脈を越えて管理するのは悪夢です。 Torvaldsは2004年にそれについて郵便でそれらを言及します。 私はこれ以来どれが変わったのか分かりません。 –

0

私はパフォーマンスの観点から試してみませんでしたが、C++コンパイラでCアプリケーションをコンパイルするのは良い考えです。宣言されていない関数を使用するなどの「いたずら」を防ぐことができます。

しかし、出力は同じではありません。少なくとも、Cコンパイラのコードとのリンクが解除されるような異なるシンボルが表示されます。

私はあなたが本当に意味することは、「パフォーマンス上の観点から、C++のコードを書くのは大丈夫ですか?C++のコンパイラでコンパイルするのですか?」と思いますか?

また、C++がサポートしていないbool_tなどのC99のものを使用しないでください。

+0

私はCコードの既存のボディを持っていると私はC++コンパイラでコンパイルするために小さな構文的な修正(mallocからのキャスト値の削除、stdboolの削除など)を行い、パフォーマンスデルタに興味があります。 – cdleary

+0

私は「試してみてください」と言わなければなりません。私はバイナリが実行時に遅く実行されるとは考えていませんが、少し大きかったり起動時間が長くなったりします。 – MarkR

+0

そうですね、私の質問は、人々が「試してみた」とか(さまざまなアプリケーションでうまくいけば)見たかどうか、結果を記録して公開するかどうか疑問に思っています。 ;-) – cdleary

1

私はどんな研究も知らないし、誰かがそれをする時間を費やすことはないだろう。基本的に、C++コンパイラでコンパイルするとき、コードはCコンパイラでコンパイルするときと同じセマンティックを持ちます。したがって、最適化とコード生成には至りません。しかし、IMOは、CとC++の間の一般的な記述を可能にするためには、あまりにもコンパイラ固有のものです。

C++コンパイラでCコードをコンパイルするときに主に得られるのは、より厳密なチェック(関数宣言など)です。 IMOこれはC++コンパイラを使ってコンパイルするのはかなり魅力的です。ただし、C++コンパイラで実行されることのない大きなCコードベースを使用している場合は、非常にのコードがコンパイルされて意味のある警告が表示されるまで急上昇する可能性が高いことに注意してください。

+0

C++コンパイラを使用すると、より厳密なチェックが行われるのはなぜですか?あるいは、あなたは警告旗を聞いたことがない人の一人でしょうか(gccのための少なくとも '-pedantic -Wall -Wextra';より完全なリストについては、こちらをご覧ください:http://stackoverflow.com/questions/432835 /あなたがプログラマーとして書かれた品質のCコード/ 432852#432852)をどうやってあなたに保証しますか? – Christoph

+0

@Christoph:C++は_より厳しくなっています。例えば、'void * 'から他のポインタ型への暗黙的な変換は許可されません。明示的にキャストする必要があります。このようなものは、私が言及したものです。 – sbi

+0

C++はより安全な言語かもしれませんが、C++コンパイラを使用してCコードをコンパイルする*! C++と互換性のあるCのC++よりも暗黙のキャスト(暗黙的なキャスト)の問題は別として、実際にはC++は複合リテラルや指定された初期化子のようなものをサポートしていないため、 ;私がC++コンパイラで考えることができる唯一の本当の問題は、(ライブラリ)関数の戻り値を介して 'const'を静かに落とすことですが、次にstdlibのオーバーロードされたC++バージョンを使用する必要がありますコンパイラでコンパイルすることができないコードである – Christoph

-1

これまで私は、C++の巨大なバイナリのサイズを調べるようなことをやったことがあります。それは、単純に束縛されていないライブラリをリンクしているということです。一番簡単なのは、gcc -Smyprog.cppとgcc -Smyprog.cを使用し、アセンブラ出力をdiffすることです。データポイント(または少なくとも逸話)を追加する

+0

結果のバイナリのサイズは、パフォーマンスにほとんど影響しません。そのasm表現もありません。 – ezpz

+0

asmは、非膨大なコードから肥大したコードをはっきりと示しています。 asmがそれらが似ていることを示している場合は、それらを実行する必要があります。 –

+0

もちろん、パフォーマンスが必要な場合は、とにかくgccを使用しません。 –

13

我々は最近、小規模な組み込みのようなターゲットのための数学ライブラリを書いて、プロジェクトの途中についてC.でそれを書き始めた、我々はいくつかを切り替えます多くのほぼ同じコードを書く(あるいは、プリプロセッサマクロに40行の関数を埋め込む)いくつかの関数のテンプレートを使うために、C++にファイルを書き込むことができます。

切り替えを開始した時点で、いくつかの関数で生成されたアセンブリコード(GCCを使用)を非常に注意深く見て、ファイルがコンパイルされたかどうかは本質的に同じであることを確認しましたCまたはC++ - 「本質的に同一」とは、アセンブリファイルの最初と最後にシンボル名やものなどの違いがあったことを意味します。機能の真ん中の実際の命令はまったく同じでした。

申し訳ありませんが、私はより確かな答えを持っていません。追加する

編集、2013年3月24日:最近、私はラスティ・ラッセルは、Cコンパイラでコンパイルし、GCCをコンパイルするには、最近のスイッチに対応して、C++コンパイラでコンパイルGCCのパフォーマンスを比較した記事に出くわしましたC++の場合:http://rusty.ozlabs.org/?p=330。結論は興味深い:C++コンパイラでコンパイルされたバージョンは非常にわずかに遅かった。その差は約0.3%であった。しかし、これは大規模なデバッグ情報によって引き起こされるロード時間の差によって完全に説明されました。彼がバイナリを取り除いてデバッグ情報を取り除いたとき、その差は0.1%未満、すなわち測定ノイズと本質的に区別できませんでした。

+2

申し訳ありませんが、これは今までのところ最も実証された答えのようです。 – sbi

0

コードが設計されていない場合は実行しないでください。同じ有効な言語構成は、CまたはC++として解釈されると、異なる動作につながる可能性があります。バグを理解するのが非常に難しいかもしれません。それほど問題はありませんが、依然として保守性の悪夢です。いくつかのC構文(特にC99から)はC++では有効ではありません。

1

GCCプロジェクトは現在CからC++への移行中です。つまりGCCは将来C++で実装される可能性がありますが、現在はCで書かれています.GCCの次のリリースはCのサブセットこれも有効なC++です。

Some performance testsは、GCCのコードベースでg++gccで実行されました。彼らは、gccをsysmemコンパイラでコンパイルし、結果のコンパイラでコンパイルしてから、結果を繰り返してチェックするという "ブートストラップ"時間を比較しました。

要約:g ++を使用すると、20%遅くなりました。コンパイラのバージョンは若干異なりますが、20%の違いはありません。

これはgccとg ++の異なるプログラムを測定することに注意してください。これらのプログラムはほとんど同じコードを使用しますが、フロントエンドが異なります。

関連する問題