4.5インライン関数


Q 1:inlineキーワード


•inlineリクエストが受信されたかどうかについて


•inlineキーワードはリクエストです.このリクエストが受信された場合、コンパイラは、この関数を1つの式で合理的に拡張できると考えなければなりません.
•この妥当性は、このインライン関数の実行コストが一般的な関数呼び出しおよび戻りメカニズムによる負荷よりも低いことに現れます(コンパイラ内部に測定方法があります).

•1つのinline関数を処理するには2つの段階があります

  • 関数定義を解析して、関数の「instrisic inline ability」(コンパイラに関連するインライン能力、「instrisic」-固有、ここでは「コンパイラに関連する」)を決定します.注:1つの関数がその複雑さや構築の問題でinlineにならないと判定された場合、static関数に変換され、「コンパイラされたモジュール」内で対応する関数定義
  • が生成されます.
  • 本物のinline関数拡張操作呼び出しの点で展開注意:cfrontコンパイラでは、inline関数が1つの式しかない場合、その2番目または後続の呼び出し操作は
  • 拡張されません.

    Q 2:実際のパラメータがインライン関数に与える影響


    •次のインライン関数を例に挙げます。

        inline int min(int i, int j)
        {
            return i < j ? i : j;
        }

    以下のいくつかの呼び出し方法について説明します.
        int foo();
        int bar();
    
        int main()
        {
    
            int minval;
            int val1 = 1024;
            int val2 = 2048;
    
            /*(1)*/ minval = min(foo(), bar() + 1);        
            /*(2)*/ minval = min(1024, 2048);
            /*(1)*/ minval = min(val1, val2);
    
            return 0;
        }

    •実相は副作用のある表現


    説明:実パラメータが副作用のある式の場合、一時オブジェクトを導入する必要があります.上記(1)のように、評価を繰り返すことを避けるために一時オブジェクトをインポートする必要があります.次のようにします.
        int t1;
        int t2;
    
        minval = (t1 = foo()), (t2 = bar() + 1), t1 < t2 ? t1 : t2;
    

    •実パラメトリック定数式


    説明:置換前に評価操作を完了する必要があります.後続のインライン置換では、定数を直接対応する位置にバンドルできます.上記(2)のように定数を直接バインドすることができる.次のようにします.
     minval = 1024;

    •実パラメータは、副作用式でも定数式でもありません


    この時点で直接置換すればよい
    *注意:インライン関数のローカル変数は、一時的なオブジェクトを生成し、インライン関数の変換と呼び出しのオーバーヘッドを増加させます.