Main Content

coder.inline

生成されたコードで特定の関数のインライン化を制御

説明

coder.inline('always') は、生成されたコードで現在の関数をインライン化します。coder.inline('always') 最適化命令を使用して、関数呼び出しを呼び出される関数の内容 (本文) に置き換えます。インライン化により、関数呼び出しのオーバーヘッドがなくなり、生成された C/C++ コードをさらに最適化できます。ただし、インライン化で生成される C/C++ コードは大きく、複雑になることがあります。

coder.inline('always') 命令では以下のインライン化はサポートされていません。

  • エントリポイント関数。

  • 再帰関数。

  • parfor ループを含む関数。

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

coder.inline('never') は、生成コード内の現在の関数がインライン化されるのを防ぎます。coder.inline('never') 命令は、MATLAB® ソース コードと生成コードの間のマッピングを単純化する場合に使用します。

coder.inline('never') 最適化命令では以下のインライン化は阻止されません。

  • 空の関数。

  • 定数出力を返す関数。

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

coder.inline('default') は、コード ジェネレーターに対して、内部のヒューリスティックな方法を使用して現在の関数をインライン化するかどうかを指示します。通常は、そうしたヒューリスティックな方法によって高度に最適化されたコードが生成されます。これらの最適化を微調整しなければならない場合にのみ、coder.inline を MATLAB 関数内で明示的に使用するようにしてください。追加のガイドラインについては、Tips (MATLAB Coder)を参照してください。

すべて折りたたむ

この例では、関数 foo は生成コードでインライン化されません。

function y = foo(x)
  coder.inline('never');
  y = x;
end

制御フロー コードでは coder.inline を使用できます。ソフトウェアで矛盾する coder.inline 命令を検出した場合、生成コードは既定のインライン経験則を使用して警告を表示します。

メモリ量の少ないシステムで実行される除算関数用のコードを生成すると想定します。生成コードでメモリ使用量を最適化するには、関数 inline_division で、スカラー除算を実行するかベクトル除算を実行するかに基づき、インライン化を手作業で制御します。

function y = inline_division(dividend, divisor)

% For scalar division, inlining produces smaller code
% than the function call itself.  
if isscalar(dividend) && isscalar(divisor)
   coder.inline('always');
else
% Vector division produces a for-loop.
% Prohibit inlining to reduce code size.
   coder.inline('never');
end

if any(divisor == 0)
   error('Cannot divide by 0');
end

y = dividend / divisor;

ヒント

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

  • codegen コマンドまたは MATLAB Coder™ アプリを使用して C/C++ コードを生成する場合、記述する関数に対して生成されるコードと MathWorks® 関数に対して生成されるコードでは、速度および可読性の要件に差異が生じる場合があります。生成コード ベースのこれら 2 つの部分に関するインライン化の動作を、それらの間の境界で個別に制御できる、その他のグローバル設定もあります。生成コードのパフォーマンスと可読性を微調整するためのインライン化の制御 (MATLAB Coder)を参照してください。

拡張機能

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

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

バージョン履歴

R2011a で導入