2016-05-30 2 views
-4

私は、プリプロセッサは、コンパイラがコンパイルされた関数定義のコピーを各関数呼び出しに書き込む間に、コンパイル前にコードをマクロのコピーテキストとして展開すると信じています。したがって、どちらの場合も、通常の関数呼び出しのオーバーヘッドは避けましたが、この場合、オーバーヘッド、インライン関数、またはMACROがより高速で、より少ないですか?より高速なインライン関数またはMACROです

+0

私は前処理されたコードで両方の違いを表示できますか? –

+0

私はMAX(x、y)(x> y?x:y)を持っています.... int(int x、inty){return x> y? x:y;} –

+1

もっと速い?あなたは働くことを意味しますか? –

答えて

2

マクロは、コンパイラのヒューリスティックにマクロがインライン展開されるかどうかに関わらず、「高速」になります。マクロの欠点を考えれば、この決定をコンパイラに任せておく方が良いでしょう。デバッグレベルと対応するソースコードにも問題があります。最適化レベル、 '強制的な'インライン展開、たとえば__attribute__ ((__always_inline__))(gcc/clang)さらに重要なことは、マクロ内での複数式の展開/評価などの一般的な落とし穴を避けることです。

私はS.O.を行っていません。質問の検索(あなたは習慣に入るべきです)が、これは以前よりずっと詳細に答えられていると思われます。

+2

OTOH、コンパイラが関数をインライン化していない場合、そうしないとよい理由があるかもしれません。それはコードをスピードアップするかもしれません!そして、あなたは他の重要な違いを見逃しました。おそらくそれは実際にはダブルを検索する方が良いです – Olaf

+0

@Olaf - 私は確かに他の用途を見逃しています。マクロがまだ高性能なコードで表示されているという事実。 Linuxやその他の高性能なソフトウェアで見つかった '__asm__'ブロックマクロと似ています。非テール再帰呼び出しは、例えばインライン化することはできません。 「軽量」可視関数によって呼び出される翻訳単位の高価な静的関数は、コードを膨らませます。 –

+0

マクロを必要とする他の理由、特にアセンブラコードやテンプレートのようなコード生成がある。例えばこの問題があった。即時オペランドを必要とするブレークポイント命令では、gccはインライン引数を適切に 'asm'制約に渡すことができず、アセンブラは不平を言った。しかし、ほとんどのマクロは現在では時代遅れであり、しばしば最新の進歩(LTOを含む)を逃した/無視したばかりのpplに由来します。上記のような質問をしている人は、通常、機能的なマクロ(犯罪はなく、ただの観察)は必要ありません。 – Olaf

関連する問題