Main Content

coder.inline

控制生成的代码中特定函数的内联

说明

示例

coder.inline('always') 在生成的代码中对当前函数进行内联。使用 coder.inline('always') 优化指令将函数调用替换为被调函数的内容(函数体)。内联消除了函数调用的开销,并为进一步优化生成的 C/C++ 代码提供了机会。但是,内联可能生成更庞大、更复杂的 C/C++ 代码。

coder.inline('always') 指令不支持以下项的内联:

  • 入口函数。

  • 递归函数。

  • 包含 parfor 循环的函数。

  • parfor 循环中调用的函数。

示例

coder.inline('never') 可阻止在生成的代码中内联当前函数。当您要简化 MATLAB® 源代码和生成代码之间的映射时,请使用 coder.inline('never') 指令。

coder.inline('never') 优化指令不会阻止以下项的内联:

  • 空函数。

  • 返回常量输出的函数。

若要即使在这些情况下也防止内联,请在 MATLAB 代码中的函数调用点对输入使用 coder.ignoreConst (MATLAB Coder) 函数。有关详细信息,请参阅Resolve Issue: coder.inline('never') Does Not Prevent Inlining of Function (MATLAB Coder)

coder.inline('default') 指示代码生成器使用内部启发式方法来确定是否内联当前函数。通常,这些启发式方法会产生高度优化的代码。仅当需要微调这些优化时,才在 MATLAB 函数中显式使用 coder.inline。有关其他规范,请参阅提示 (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® 函数生成的代码,您可能有不同的速度和可读性要求。某些其他全局设置使您能够分别控制生成的代码库的这两个部分以及它们之间边界处的内联行为。请参阅Control Inlining to Fine-Tune Performance and Readability of Generated Code (MATLAB Coder)

扩展功能

C/C++ 代码生成
使用 MATLAB® Coder™ 生成 C 代码和 C++ 代码。

GPU 代码生成
使用 GPU Coder™ 为 NVIDIA® GPU 生成 CUDA® 代码。

版本历史记录

在 R2011a 中推出