C ++のインラインとマクロの違い

著者: Laura McKinney
作成日: 2 4月 2021
更新日: 9 5月 2024
Anonim
初心者のためのC ++チュートリアルEp#10-#defineマクロとマクロ関数-SavvyNik
ビデオ: 初心者のためのC ++チュートリアルEp#10-#defineマクロとマクロ関数-SavvyNik

コンテンツ


マクロは、呼び出し時に展開される命令です。マクロなどの関数も定義できます。同様に、インライン関数も呼び出しの時点で展開します。インライン関数とマクロ関数の主な違いの1つは、 インライン関数 中に展開されます 編集、 そしてその マクロ プログラムが処理されるときに展開されます プリプロセッサ.

比較チャートを使用して、インラインとマクロの違いを調べてみましょう。

  1. 比較表
  2. 定義
  3. 主な違い
  4. 結論

比較表

比較の根拠列をなして大きい
ベーシック インライン関数はコンパイラーによって解析されます。マクロはプリプロセッサによって展開されます。
構文インラインreturn_type funct_name(parameters){。 。 。 }#define macro_name char_sequence
使用されるキーワード列をなして
#define
定義済みクラスの内部または外部で定義できます。これは常にプログラムの開始時に定義されます。
評価引数を1回だけ評価します。コードで使用されるたびに引数を評価します。
拡張 コンパイラーは、すべての関数をインライン化および展開しない場合があります。マクロは常に展開されます。
オートメーションクラス内で定義された短い関数は、インライン関数に自動的に作成されます。マクロは明確に定義する必要があります。
アクセス中インラインメンバー関数は、クラスのデータメンバーにアクセスできます。マクロは決してクラスのメンバーになることができず、クラスのデータメンバーにアクセスできません。
終了インライン関数の定義は、インライン関数の終わりに中括弧で終了します。マクロの定義は新しい行で終了します。
デバッグコンパイル中にエラーチェックが行われるため、インライン関数のデバッグは簡単です。コンパイル中にエラーチェックが発生しないため、マクロのデバッグが困難になります。
バインディングインライン関数は、関数の本文のすべてのステートメントを、関数の本文の開始と終了を中括弧で非常にうまくバインドします。マクロは、終了記号がないため、複数のステートメントがある場合、バインドの問題に直面します。


インラインの定義

インライン関数は通常の関数のように見えますが、キーワード「列をなして「。インライン関数は、呼び出される代わりに、呼び出しの時点で展開される短い長さの関数です。例でインライン関数を理解しましょう。

#含める 名前空間stdを使用します。 class example {int a、b; public:inline void initialize(int x、int y){a = x; b = y} void display(){cout << a << "" <

上記のプログラムでは、関数initialize()をクラス「example」のインライン関数として宣言および定義しました。 initialization()関数のコードは、クラス「example」のオブジェクトによって呼び出される場所で拡張されます。クラスの例で定義されている関数display()は、インラインで宣言されていませんが、コンパイラーによってインラインと見なされる場合があります。 C ++では、クラス内で定義された関数は、関数の長さを考慮してコンパイラーによって自動的にインライン化されます。

  • インライン関数は、関数の呼び出しと戻りのオーバーヘッドを削減し、プログラムの実行時間を短縮します。また、引数はスタックにプッシュされ、関数が呼び出されたときにレジスタが保存され、関数が戻るときにリセットされますが、時間がかかります。これは、毎回ローカル変数と仮パラメータを作成する必要がないため、インライン関数によって回避されます。
  • インライン関数はクラスのメンバーになることができ、クラスのデータメンバーにアクセスすることもできます。
  • インライン関数はプログラムの実行時間を短縮しますが、インライン関数の長さがそれより大きい場合、コードの重複のためにプログラムのサイズも大きくなります。したがって、非常に小さな関数をインライン化することをお勧めします。
  • インライン関数の引数は1回だけ評価されます。

マクロの定義

マクロは「プリプロセッサディレクティブ」です。コンパイルの前に、プログラムはプリプロセッサによって検査され、プログラム内でマクロが見つかると、定義によってそのマクロを置き換えます。したがって、マクロは「置換」と見なされます。例でマクロを勉強しましょう。


#含める #define GREATER(a、b)((a <b)?b:a)int main(void){cout << "10と20の大きい方は" << GREATER( "20"、 "10")<< 「 n」; 0を返します。 }

上記のコードで、マクロ関数GREATER()を宣言しました。この関数は、両方のパラメーターのより大きな数を比較して見つけます。マクロは新しい行でのみ終了するため、マクロを終了するセミコロンはありません。マクロは単なる置き換えであるため、マクロが呼び出される場所でマクロのコードを拡張します。

  • 読み取り中にプログラマがプログラム内のすべてのマクロを簡単に識別できるようにするために、マクロは常に大文字で定義されます。
  • マクロはクラスのメンバー関数になることはできません。また、クラスのデータメンバーにアクセスすることもできません。
  • マクロ関数は、その定義に出現するたびに引数を評価し、予期しない結果をもたらします。
  • マクロのサイズは不必要にコードのサイズを大きくするため、マクロのサイズは小さくする必要があります。
  1. インラインとマクロの基本的な違いは、インライン関数はコンパイラーによって解析されるのに対して、プログラム内のマクロはプリプロセッサーによって展開されることです。
  2. インライン関数の定義に使用されるキーワードは「列をなして」に対して、マクロの定義に使用されるキーワードは「#define“.
  3. インライン関数がクラス内でデカールされると、クラス内またはクラス外で定義できます。一方、マクロは常にプログラムの開始時に定義されます。
  4. インライン関数に渡される引数はコンパイル中に1回だけ評価されますが、マクロ引数はコードでマクロが使用されるたびに評価されます。
  5. コンパイラーは、クラス内で定義されたすべての関数をインライン化および展開しない場合があります。一方、マクロは常に展開されます。
  6. インラインキーワードなしでクラス内で定義されている短い関数は、自動的にインライン関数になります。一方、マクロは明確に定義する必要があります。
  7. インラインの関数はクラスのメンバーにアクセスできますが、マクロはクラスのメンバーにアクセスできません。
  8. インライン関数を終了するには、閉じた中括弧が必要ですが、マクロは新しい行の開始で終了します。
  9. コンパイル中にエラーがチェックされるため、inlne関数のデバッグが容易になります。一方、マクロはコンパイル中にチェックされないため、マクロのデバッグは困難になります。
  10. 関数であるインライン関数は、開始および閉じ中括弧内のメンバーをバインドします。一方、マクロには終了記号がないため、マクロに複数のステートメントが含まれているとバインドが困難になります。

結論:

インライン関数は、マクロ関数よりもはるかに説得力があります。 C ++は、「const」キーワードを使用する定数を定義するためのより良い方法も提供します。