メインコンテンツ

coder.nonInlineCall

生成されたコードで呼び出される関数のインライン化を防止する

R2024a 以降

    説明

    out = coder.nonInlineCall(functionCall)functionCall を評価し、生成されたコードでその関数がインライン化されるのを防ぎます。functionCall は 1 つ以上の入力引数を受け取り、1 つの出力を返すことができます。coder.nonInlineCall は、MATLAB® ソース コードと生成コードの間のマッピングを単純化する場合に使用します。関数 coder.nonInlineCall は、呼び出される関数内の coder.inline 命令をオーバーライドします。

    関数 coder.nonInlineCall では、以下のインライン化は防止されません。

    • 空の関数

    • 定数出力を返す関数

    上記の状況でもインライン化を阻止するには、MATLAB コードの関数呼び出しサイトの入力で関数 coder.ignoreConst (MATLAB Coder) を使用します。詳細については、Resolve Issue: coder.inline("never") and coder.nonInlineCall Do Not Prevent Function Inlining (MATLAB Coder)を参照してください。

    [out1,...,outN] = coder.nonInlineCall(handle,arg1,...,argN) は、1 つ以上の入力引数をもつことができるハンドル handle を使用して関数を呼び出し、生成されたコードでその関数をインライン化しないようにコード ジェネレーターに指示します。指定された関数は複数の出力をもつことができます。

    すべて折りたたむ

    入力値の 2 乗を返し、命令 coder.inline("always") を含むローカル関数 local_Inline を作成します。coder.inline("always") 命令をオーバーライドするために coder.nonInlineCall を使用して local_Inline を呼び出すエントリポイント関数 useNonInlineCall を作成します。

    type useNonInlineCall.m
    function x = useNonInlineCall(n) %#codegen
    arguments
        n (1,1) double
    end
    x = coder.nonInlineCall(local_Inline(n));
    end
    
    function y = local_Inline(x)
    coder.inline("always");
    y = x^2;
    end
    

    useNonInlineCall の C コードを生成し、生成コード内のエントリポイント関数を検査します。コード ジェネレーターは coder.inline("always") 命令をオーバーライドし、生成されたコードで local_Inline がインライン化されるのを防ぎます。

    codegen -config:lib useNonInlineCall
    Warning: Code generation is using a coder.EmbeddedCodeConfig object. Because
    Embedded Coder is not installed, this might cause some Embedded Coder features
    to fail.
    
    
    Code generation successful (with warnings): View report
    
    type(fullfile("codegen","lib","useNonInlineCall","useNonInlineCall.c"))
    /*
     * File: useNonInlineCall.c
     *
     * MATLAB Coder version            : 25.1
     * C/C++ source code generated on  : 13-Jul-2025 17:34:30
     */
    
    /* Include Files */
    #include "useNonInlineCall.h"
    
    /* Function Declarations */
    static double local_Inline(double x);
    
    /* Function Definitions */
    /*
     * Arguments    : double x
     * Return Type  : double
     */
    static double local_Inline(double x)
    {
      return x * x;
    }
    
    /*
     * Arguments    : double n
     * Return Type  : double
     */
    double useNonInlineCall(double n)
    {
      return local_Inline(n);
    }
    
    /*
     * File trailer for useNonInlineCall.c
     *
     * [EOF]
     */
    

    円の半径を入力として受け取り、2 つの出力 (円の面積と円周) を返すローカル関数 circleMath を作成します。coder.nonInlineCall を使用して circleMath の関数ハンドルを呼び出し、この関数をインライン化しないようにコード ジェネレーターに指示するエントリポイント関数 multiOutputNonInlineCall を作成します。

    type multiOutputNonInlineCall.m
    function [area, circ] = multiOutputNonInlineCall(radius) %#codegen
    arguments
        radius (1,1) double
    end
    [area, circ] = coder.nonInlineCall(@circleMath,radius);
    end
    
    function [a,c] = circleMath(r)
    coder.inline("always");
    a = pi*r^2;
    c = pi*2*r;
    end
    

    multiOutputNonInlineCall の C コードを生成し、生成コード内のエントリポイント関数を検査します。コード ジェネレーターは coder.inline("always") 命令をオーバーライドし、生成されたコードで circleMath がインライン化されるのを防ぎます。

    codegen -config:lib multiOutputNonInlineCall
    Warning: Code generation is using a coder.EmbeddedCodeConfig object. Because
    Embedded Coder is not installed, this might cause some Embedded Coder features
    to fail.
    
    
    Code generation successful (with warnings): View report
    
    type(fullfile("codegen","lib","multiOutputNonInlineCall","multiOutputNonInlineCall.c"))
    /*
     * File: multiOutputNonInlineCall.c
     *
     * MATLAB Coder version            : 25.1
     * C/C++ source code generated on  : 13-Jul-2025 17:34:33
     */
    
    /* Include Files */
    #include "multiOutputNonInlineCall.h"
    
    /* Function Declarations */
    static double circleMath(double r, double *c);
    
    /* Function Definitions */
    /*
     * Arguments    : double r
     *                double *c
     * Return Type  : double
     */
    static double circleMath(double r, double *c)
    {
      double a;
      a = 3.1415926535897931 * (r * r);
      *c = 6.2831853071795862 * r;
      return a;
    }
    
    /*
     * Arguments    : double radius
     *                double *area
     *                double *circ
     * Return Type  : void
     */
    void multiOutputNonInlineCall(double radius, double *area, double *circ)
    {
      *area = circleMath(radius, circ);
    }
    
    /*
     * File trailer for multiOutputNonInlineCall.c
     *
     * [EOF]
     */
    

    入力引数

    すべて折りたたむ

    生成されたコードで評価してインライン化しない関数呼び出し。関数名と、必要に応じてかっこで囲んだ 1 つ以上の引数のコンマ区切りリストを続けて指定します。指定された関数は、最大で 1 つの出力引数を返すことができます。

    例: coder.nonInlineCall(myFunction(arg1,arg2))

    例: out = coder.nonInlineCall(myFunction)

    MathWorks® 関数またはユーザー記述関数へのハンドル。この関数は複数の出力をもつことができます。

    例: [out1,out2] = coder.nonInlineCall(@myFunction)

    データ型: function handle

    ハンドル handle をもつ関数への入力。関数の引数のコンマ区切りリストとして指定します。入力の型は、呼び出される関数によって異なります。

    例: out = coder.inlineCall(@myFunction,10,"myString")

    拡張機能

    すべて展開する

    C/C++ コード生成
    MATLAB® Coder™ を使用して C および C++ コードを生成します。

    GPU コード生成
    GPU Coder™ を使用して NVIDIA® GPU のための CUDA® コードを生成します。

    バージョン履歴

    R2024a で導入