コアグループ面接の——C++中マクロとインライン関数


ほほほ、今日はコアグループの面接でこのテーマを聞かれました.前にマクロ定義の知識を見たばかりだったのを覚えていますが、答えたときにインライン関数に曖昧になりました.帰ってきて資料を探してまとめています.
ほほほ先にいくつの前に比较的に印象のいくつかのマクロに来て、大きさMIN、MAXは言いませんでした
  : #define SWAP(A,B) {A=A^B; B=B^A; A=A^B}      //                 

  :#define A(x) T_##x    //  T_   x        eg.A(test) -> T_test

    : #define B(x) #@x        //  x       eg:    B(x) -> 'x'

    :  #define C(x) #x                //  x         C(test) -> "test"

インライン関数は何ですか.インライン関数は、呼び出し元のコード列にコードが挿入される関数です.inlineで定義されています.例えば、inline string dbtest(int a); 
まず共通点を言います.
#defineマクロのように、インライン関数は、呼び出すオーバーヘッドを回避することによって実行効率が向上し、いずれも関数の呼び出しを引き起こすことなく、関数を呼び出す位置で関数問題を展開する. .一般に、inline関数は再帰的ではなく、特にインライン関数は呼び出し(「プロシージャ化統合」)によってコンパイラによって最適化されることができる.
マクロとインライン関数の違い:1.マクロはコンパイラが前処理するときに関数を展開します.inline関数はコンパイル時に展開されます.    2.マクロを使用するとエラーが発生しやすくなります.これを避けるために、定義するときはパラメータごとに囲み、最後に一緒に囲みますが、inline関数は必要ありません.  3.マクロのパラメータ検査は比較的弱く、1つの関数はintタイプに実用的である可能性があり、floatタイプに実用的である可能性がある.一方inline関数は強いタイプのチェックがあり、intに実用的なのはintだけで、floatが使いたいならtemplateに頼る.
#defineマクロとは異なり、インライン関数は常にパラメータを正確に1回だけ評価し、マクロエラーを回避します.すなわち、インライン関数の呼び出しと正規関数の呼び出しは等価であり、差は、より速いマクロがプリプロセッサによってマクロに取って代わられるだけであり、インライン関数はコンパイラ制御によって実現される.また,インライン関数は真の関数である.C++コンパイラは、インライン関数の関数体を関数呼び出しの位置に拡張し、インライン関数を関数のように見せるが、関数呼び出しのオーバーヘッドに耐える必要はなく、一部の関数体の比較的簡単なインライン関数にとって、インライン関数の呼び出し効率を大幅に向上させることができる.しかし、インライン関数には代価がないわけではありません.インライン関数体が大きい場合、インライン関数の拡張はターゲットファイルと実行可能ファイルのサイズを大幅に増加させます.また、inlineキーワードはコンパイラにヒントにすぎず、強制命令ではありません.つまり、コンパイラはいくつかのinlineキーワードを無視する可能性があります.無視されると、インライン関数は一般的な関数呼び出しと見なされます.コンパイラは一般的に、ループ文、再帰呼び出しなど、関数体に複雑な文があるなど、複雑なインライン関数を無視します.したがって、インライン関数の関数体定義は簡単でなければなりません.そうしないと、効率的に損をしません.
 
また参考にしましょうが、残念ながら早く見なかったです.
http://blogold.chinaunix.net/u/11077/showart.php?id=151918
インライン関数の例:
#i nclude <iostream>
#i nclude <string>
using namespace std;// No.1

inline string dbtest(int a); //      

void main()
{
       for (int i=1;i<=10;i++)
               {
                cout << i << ":" << dbtest(i) << endl;
               }
       cin.get();

}

string dbtest(int a)
{
       return (a%2>0)?"y":"n";
}


No.1:stdはc++の標準ネーミングスペースであり、すべての標準クラスライブラリが含まれており、ヘッダファイルの識別子が定義されています.using namespace stdは、コンパイラに標準ネーミングスペースstdを使用するように伝え、プログラム内のすべての標準クラスライブラリがstdで探していることを示します.namespaceは名前の空間です.名前の衝突を避けるために使われています.名前の競合を起こさずに、異なる空間で同じ名前を使用できます.その宣言はクラスを宣言するようなものです.例:namespace A{int f(){......};  char g(){……};...}名前空間の関数を使用する場合、いくつかの方法があります.1-クラスのメンバー関数を宣言するように、クラス名が空間名A::f();2-usingキーワードusing namespace Aを使用できます.このようにして以降のコードは名前空間Aの関数を用いる.
C++はネーミング競合を防止するためにnamespaceの概念を導入し、自分の標準ライブラリをstdというnamespaceにすべて入れ、標準ライブラリを使用する際にusing namespace stdを加える.この文は、以降のライブラリでクラスや関数を使用するときに、本来書くべきstd::????を省略することができます.