メインコンテンツ

coder.inline

生成されたコードで現在の関数のインライン化を制御する

説明

coder.inline(option) は、option の指定に従って、生成された C/C++ コードにおける現在の関数のインライン化を制御します。

  • coder.inline("always") は、コード ジェネレーターに対して、生成されたコードで、関数呼び出しを呼び出される関数の内容 (本文) に置き換えるように指示します。

  • coder.inline("never") は、生成コードで現在の関数がインライン化されるのを防ぎます。

  • coder.inline("default") は、コード ジェネレーターに対して、内部のヒューリスティックな方法を使用して現在の関数をインライン化するかどうかを指示します。

インライン化により、関数呼び出しのオーバーヘッドがなくなり、生成されたコードをさらに最適化できますが、生成されるコードは大きく、複雑になることがあります。一方、インライン化を防ぐと、MATLAB® コードと生成コード間のマッピングを単純化できます。既定では、コード ジェネレーターは、内部のヒューリスティックな方法を使用して現在の関数をインライン化するかどうかを判定します。通常は、そうしたヒューリスティックな方法によって高度に最適化されたコードが生成されます。coder.inline 最適化命令は、これらの最適化を微調整する必要がある場合にのみ、MATLAB 関数で明示的に使用します。

コード ジェネレーターのインライン化動作を個々の呼び出しサイトで制御するには、coder.inlineCallcoder.nonInlineCall を使用します。

すべて折りたたむ

2 つのローカル関数 local_Inlinelocal_NoInline を呼び出すエントリポイント関数 inliningEntryPoint を作成します。どちらのローカル関数も入力値の 2 乗を返します。ただし、local_Inline は命令 coder.inline("always") を使用しますが、local_NoInline は命令 coder.inline("never") を使用します。

type inliningEntryPoint.m
function [x,y] = inliningEntryPoint(n) %#codegen
arguments
    n (1,1) double
end
x = local_Inline(n);
y = local_NoInline(n);
end

function y = local_Inline(x)
coder.inline("always");
y = x^2;
end

function y = local_NoInline(x)
coder.inline("never");
y = x^2;
end

inliningEntryPoint の C コードを生成し、生成コード内のエントリポイント関数を検査します。コード ジェネレーターは、local_Inline の呼び出しをインライン化しますが、local_NoInline の呼び出しはインライン化しません。

codegen -config:lib inliningEntryPoint
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","inliningEntryPoint","inliningEntryPoint.c"))
/*
 * File: inliningEntryPoint.c
 *
 * MATLAB Coder version            : 25.1
 * C/C++ source code generated on  : 13-Jul-2025 17:33:48
 */

/* Include Files */
#include "inliningEntryPoint.h"

/* Function Declarations */
static double local_NoInline(double x);

/* Function Definitions */
/*
 * Arguments    : double x
 * Return Type  : double
 */
static double local_NoInline(double x)
{
  return x * x;
}

/*
 * Arguments    : double n
 *                double *x
 *                double *y
 * Return Type  : void
 */
void inliningEntryPoint(double n, double *x, double *y)
{
  *x = n * n;
  *y = local_NoInline(n);
}

/*
 * File trailer for inliningEntryPoint.c
 *
 * [EOF]
 */

複数の coder.inline 命令を使用して、入力引数などのパラメーターに基づいて関数のインライン化を制御できます。

ローカル関数 simpleDivision を呼び出すエントリポイント関数 conditionalInlining を作成します。複数の coder.inline 命令を使用して、両方の入力引数がスカラーの場合にのみ simpleDivision をインライン化するようにコード ジェネレーターに指示します。

type conditionalInlining.m
function out = conditionalInlining(x,y) %#codegen
out = simpleDivision(x,y);
end

function y = simpleDivision(dividend, divisor)
if isscalar(dividend) && isscalar(divisor)
    forceInlining = "always";
else
    forceInlining = "default";
end
coder.inline(forceInlining)
y = dividend / divisor;
end

スカラー入力を指定して conditionalInlining の C コードを生成し、生成されたコード内のエントリポイント関数を調べます。コード ジェネレーターは、生成されたコードで simpleDivision をインライン化します。

codegen -config:lib conditionalInlining -args {3 4}
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","conditionalInlining","conditionalInlining.c"))
/*
 * File: conditionalInlining.c
 *
 * MATLAB Coder version            : 25.1
 * C/C++ source code generated on  : 13-Jul-2025 17:35:01
 */

/* Include Files */
#include "conditionalInlining.h"

/* Function Definitions */
/*
 * Arguments    : double x
 *                double y
 * Return Type  : double
 */
double conditionalInlining(double x, double y)
{
  return x / y;
}

/*
 * File trailer for conditionalInlining.c
 *
 * [EOF]
 */

ベクトル入力を指定して conditionalInlining の C コードを生成し、生成されたコード内のエントリポイント関数を調べます。コード ジェネレーターは内部のヒューリスティックな方法を使用して、生成されたコード内で simpleDivision をインライン化するかどうかを決定します。

codegen -config:lib conditionalInlining -args {1:10 11:20}
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","conditionalInlining","conditionalInlining.c"))
/*
 * File: conditionalInlining.c
 *
 * MATLAB Coder version            : 25.1
 * C/C++ source code generated on  : 13-Jul-2025 17:35:03
 */

/* Include Files */
#include "conditionalInlining.h"
#include "mrdivide_helper.h"
#include "rt_nonfinite.h"

/* Function Definitions */
/*
 * Arguments    : const double x[10]
 *                const double y[10]
 * Return Type  : double
 */
double conditionalInlining(const double x[10], const double y[10])
{
  return mrdiv(x, y);
}

/*
 * File trailer for conditionalInlining.c
 *
 * [EOF]
 */

入力引数

すべて折りたたむ

現在の MATLAB 関数のインライン化の制御。"default""always"、または "never" として指定します

  • coder.inline("default") は、コード ジェネレーターに対して、内部のヒューリスティックな方法を使用して現在の関数をインライン化するかどうかを指示します。coder.inline("default") 命令は、グローバル インライン化設定をオーバーライドする場合にのみ使用します。生成コードのパフォーマンスと可読性を微調整するためのインライン化の制御 (MATLAB Coder)を参照してください。

  • coder.inline("always") は、コード ジェネレーターに対して、生成されたコードで、関数呼び出しを呼び出される関数の内容 (本文) に置き換えるように指示します。coder.inline("always") 命令では以下のインライン化はサポートされていません。

    • エントリポイント関数

    • 再帰関数

    • parfor ループを含む関数

    • parfor ループから呼び出される関数

  • coder.inline("never") は、生成コードで現在の関数がインライン化されるのを防ぎます。coder.inline("never") 最適化命令では以下のインライン化は阻止されません。

    • 空の関数

    • 定数出力を返す関数

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

ヒント

  • codegen (MATLAB Coder) コマンドまたは fiaccel (Fixed-Point Designer) コマンドを使用する場合に、-O disable:inline オプションを使用することで、すべての関数のインライン化を無効にできます。

  • 作成した関数から生成された C/C++ コードと、MATLAB 関数から生成された C/C++ コードでは、速度と読みやすさの要件が異なる場合があります。追加のグローバル設定を使用すると、生成されたコード ベースのこれらの 2 つの部分のインライン化を制御できます。生成コードのパフォーマンスと可読性を微調整するためのインライン化の制御 (MATLAB Coder)を参照してください。

拡張機能

すべて展開する

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

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

バージョン履歴

R2011a で導入

すべて展開する