-2

重複の可能性:
インライン関数 vs プリプロセッサ マクロ
インライン関数の概念とマクロとの違いは何ですか?

inline unsigned int getminutes( unsigned int seconds )
{
    return( seconds / 60 );
}

#define GetMinutes(seconds) (seconds) / (60)

正直に言うと、どれがより速いかを尋ねたいと思いますが、SOで多くのことを見てきたので、どちらが優れているかを尋ねると知識が得られます。(はい! 私はナレッジ ハンターです)

4

4 に答える 4

4

インライン関数を使用して同じことを達成できる場合は、マクロを使用しないでください。かなり適切なソリューションを使用していると仮定すると、コンパイラは、提供した両方のソリューションに対してまったく同じコードを生成します。

もちろん、インライン関数が実際にインライン化されるという保証はありませんが、これらの場合、コンパイラがその関数をインライン化できない場合は、おそらく非常に悪いものです。

本当に必要でない限り、マクロを使用しないでください(ヘッダーガード、繰り返しの作業など)。マクロはいくつかの点で悪です。オンラインで情報を検索すると、それについて多くの情報を読むことができます。

于 2012-09-26T17:53:19.737 に答える
2

inlineコンパイラが使用することを保証していないと考えると、マクロはより高速になると思います。関数がインライン化されていない場合は、関数呼び出しのオーバーヘッドがあります。

マクロはプリプロセッサによってその場で展開されるため、常にインラインになります。また、マクロはタイプ セーフではなく、グローバル スコープを持ちます。

機能が優先されます。

于 2012-09-26T17:53:24.420 に答える
0

優れた最適化コンパイラを使用すると、パフォーマンスは同じになります。違いは、インライン関数が多かれ少なかれコンパイラへの提案であることです。ほとんどの場合、コンパイラは提案を尊重するはずですが、マクロ バージョンではコンパイラにコードのインライン化を強制します。

余談ですが((seconds) / 60)、意図したグループ化がすべての場合に使用されるように、マクロを作成する必要があります。

于 2012-09-26T17:57:45.037 に答える
0

残念ながら、どちらが速いかは、知る唯一の方法がプロファイリングである場合の 1 つです。ただし、結果は通常のリリース ビルド設定でも同じであると思われます。

どちらが良いですが、インライン関数と言えます。デバッグが容易になります。マクロより安全。

絶対に必要な場合を除いて、マクロは避けます。私はそれらをコンパイル時の検索と置換と考えています。検索と置換は、最悪の場合非常に危険だと思います。#define マクロが嫌いな理由について、実際に 1つか2 つの投稿を書きました...

私が実行するもう 1 つのアドバイス: コンパイラはあなたよりもよく知っています。実際にはパフォーマンスが良くない場合でも、マクロはインライン化を強制します。inlineインライン化の候補として提案しますが、インライン化の基準を満たさない場合はインライン化しない場合があります。

于 2012-09-26T18:00:09.987 に答える