比較チャートを使ってインラインとマクロの違いを調べましょう。
比較表
比較基準 | 列をなして | マクロ |
---|---|---|
基本 | インライン関数はコンパイラによって解析されます。 | マクロはプリプロセッサによって展開されます。 |
構文 | インラインreturn_type funct_name(parameters){。 。 。 } | #define macro_name char_sequence |
使用キーワード | 列をなして | #define |
定義済み | クラスの内部または外部で定義できます。 | 常にプログラムの開始時に定義されています。 |
評価 | 引数を一度だけ評価します。 | コード内で使用されるたびに引数を評価します。 |
拡張 | コンパイラは、すべての関数をインライン展開して展開することはできません。 | マクロは常に展開されています。 |
オートメーション | クラス内で定義されている短い関数は自動的にインライン関数になります。 | マクロは明確に定義されるべきです。 |
アクセス | インラインメンバー関数はクラスのデータメンバーにアクセスできます。 | マクロはクラスのメンバーになることはできず、クラスのデータメンバーにアクセスすることはできません。 |
終了 | インライン関数の定義は、インライン関数の最後に中括弧で終わります。 | マクロの定義は改行で終わります。 |
デバッグ | エラーチェックはコンパイル中に行われるため、インライン関数のデバッグは簡単です。 | コンパイル時にエラーチェックが行われないため、マクロのデバッグは困難になります。 |
製本 | インライン関数は、関数本体の先頭部分と中括弧で囲まれた部分だけでなく、関数本体のすべてのステートメントをバインドします。 | マクロに終了記号がないため、マクロに複数のステートメントがあると、バインディングの問題に直面します。 |
インラインの定義
インライン関数は通常の関数のように見えますが、キーワード " inline "が前に付きます。 インライン関数は、呼び出されるのではなく、呼び出しの時点で拡張される短い関数です。 例を使ってインライン関数を理解しましょう。
#名前空間stdを使用します。 クラス例{int a、b;} public:inline void initialize(整数x、整数y){a = x;} void display(){cout << a << "" <上記のプログラムでは、クラス "example"のインライン関数として、関数initialization()を宣言して定義しました。 initialization()関数のコードは、クラス「example」のオブジェクトによって呼び出された場所で展開されます。クラスexampleで定義されている関数display()はインライン宣言されていませんが、コンパイラによってインラインと見なされます。 C ++では、クラス内で定義された関数は、関数の長さを考慮してコンパイラによって自動的にインライン化されます。
- インライン関数は、関数の呼び出しと戻るのオーバーヘッドを減らし、それがプログラムの実行時間を短縮します。 また、引数はスタックにプッシュされ、関数が呼び出されたときにレジスタが保存され、関数の復帰時にリセットされます。時間がかかります。インライン関数では毎回ローカル変数と仮パラメータを作成する必要がないので避けられます。 。
- インライン関数はクラスのメンバーになることも、クラスのデータメンバーにアクセスすることもできます。
- インライン関数はプログラムの実行時間を短縮しますが、インライン関数の長さがそれより大きいと、コードの重複のためにプログラムのサイズも大きくなることがあります。 したがって、非常に小さな関数をインライン化するのは良い習慣です。
- インライン関数の引数は一度だけ評価されます。
マクロの定義
マクロは「プリプロセッサ指令」です。 コンパイルの前に、プログラムはプリプロセッサによって検査され、プログラム内でそのマクロが見つかったところで、そのマクロをその定義で置き換えます。 したがって、マクロは「テキスト置換」と見なされます。 例を挙げてマクロを学びましょう。
#include #define GREATER(a、b)((a <b)?b:a)int main(void){cout << "10と20のどちらか大きい方が" << GREATER( "20"、 "10") << "\ n"; 0を返します。 }
上記のコードで、私はマクロ関数GREATER()を宣言しました。 マクロは改行だけで終了するため、マクロを終了するセミコロンはありません。 マクロは単なるテキストの置き換えなので、呼び出された場所のマクロのコードが拡張されます。
- プログラマーが読みながらプログラム内のすべてのマクロを識別しやすくするために、マクロは常に大文字で定義されています。
- マクロはクラスのメンバー関数になることはできませんし、どのクラスのデータメンバーにもアクセスすることはできません。
- マクロ関数は、定義に現れるたびに引数を評価します。その結果、予期しない結果になります。
- 大きいマクロは不必要にコードのサイズを大きくするので、マクロは小さいサイズでなければなりません。
インラインとマクロの主な違い
- インラインとマクロの基本的な違いは、インライン関数はコンパイラによって解析されるのに対し、プログラム内のマクロはプリプロセッサによって展開されることです。
- インライン関数の定義に使用されるキーワードは「 inline 」ですが、マクロの定義に使用されるキーワードは「 #define 」です。
- インライン関数がクラス内で宣言されると、クラス内またはクラス外で定義できます。 一方、マクロは常にプログラムの開始時に定義されます。
- インライン関数に渡される引数はコンパイル中に一度だけ評価されますが、マクロの引数はコード内でマクロが使用されるたびに評価されます。
- コンパイラは、クラス内で定義されているすべての関数をインライン展開して展開することはできません。 一方、マクロは常に展開されています。
- inlineキーワードなしでクラス内で定義されているshort関数は自動的にインライン関数になります。 一方、マクロは具体的に定義する必要があります。
- インラインの関数はクラスのメンバーにアクセスできますが、マクロはクラスのメンバーにアクセスできません。
- インライン関数を終了するには閉じ中括弧が必要ですが、マクロは新しい行の先頭で終了します。
- コンパイル中にエラーがないかチェックされるため、デバッグはインライン関数に対して簡単になります。 一方、コンパイル中はマクロのチェックが行われないため、マクロのデバッグが困難になります。
- 関数であるインライン関数は、開始および閉じ中括弧内でそのメンバーをバインドします。 一方、マクロには終了記号がないため、マクロに複数のステートメントが含まれているとバインドが難しくなります。
結論:
インライン関数はマクロ関数よりはるかに説得力があります。 C ++は、定数を定義するためのより良い方法も提供します。これは、「const」キーワードを使用します。