前処理/インライン関数とマクロ定義
面接問題:インライン関数とマクロの違いは何ですか.答え:インライン関数は通常の関数に比べてプログラムの実行速度を速めることができます.呼び出しを中断する必要がないため、コンパイル時にインライン関数を直接ターゲットコードに埋め込むことができます.マクロは単純な置換にすぎません.1.インライン関数は、マクロと比較したインライン関数の利点であるパラメータタイプチェックを行います.2.inlineとは埋め込みコードで、関数を呼び出す場所でジャンプではなく、コードを直接そこに書くことです.短いコードではinlineが空間消費を増加させることによって効率が向上し、マクロと同じであるが、inlineはマクロに比べて追加の代価を払わずに安全である.インライン関数が必要かどうかは、実際の状況に応じて取捨選択する必要があります.inlineは一般的に以下の場合にのみ使用される:(1)、1つの関数が繰り返し呼び出される;(2)、関数は単純な数行のみであり、関数内にはfor,while,switch文は含まれていない.一般的に、書き込みウィジェットはinlineとして定義する必要はありませんが、プロジェクトを完了するには、単純な関数が複数回呼び出される場合はinlineを考慮する必要があります.3.マクロはC言語では極めて重要であり、C++ではあまり使われていない.マクロに関する最初のルールは、そうしなければならない限り、決して使用すべきではありません.ほとんどのマクロは、コンパイラがプログラムの本文を見る前に、これらの本文を再配置するため、プログラム設計言語、プログラム、またはプログラマーの欠陥を示しています.マクロも多くのプログラム設計ツールの主なトラブルです.4.マクロは、コードに検証を加えない単純な代替であり、インライン関数は、コードを呼び出しに直接挿入し、通常の関数呼び出し時のリソース消費を低減する.5.マクロは関数ではなく、コンパイル前(前処理フェーズ)にプログラム内の文字列をマクロに置き換えます.6.キーワードinlineは、関数をインライン化するには、関数定義体と一緒に置く必要があります.inlineを関数宣言の前に置くだけでは何の役にも立たない.次のようなスタイルの関数Fooはインライン関数にはなりません.
次のようなスタイルの関数Fooは、インライン関数となります.インラインは、コード膨張(レプリケーション)を対価とし、関数呼び出しのオーバーヘッドを省くだけで、関数の実行効率を向上させる.関数内のコードを実行する時間が,関数のオーバーヘッドよりも大きい場合,効率の収穫は少ない.一方,各インライン関数の呼び出しは,プログラムの総コード量を増大させ,より多くのメモリ空間を消費する. 以下の場合、クラスの構造関数と構造関数は、内部結合を使用するとより効果的だと誤解されやすい.コンストラクション関数およびコンストラクション関数は、ベースクラスまたはメンバーオブジェクトのコンストラクション関数およびコンストラクション関数がこっそり実行されるなど、いくつかの動作を非表示にする可能性があることに注意してください.したがって、クラス宣言にコンストラクション関数とコンストラクション関数の定義体を勝手に置かないでください.良いコンパイラは、関数の定義体に基づいて、価値のないインラインを自動的にキャンセルします.
inline void Foo(int x, int y); //inline
void Foo(int x, int y) {}
次のようなスタイルの関数Fooは、インライン関数となります.
void Foo(int x, int y);
inline void Foo(int x, int y) //inline