主要内容

coder.inline

控制生成代码中当前函数的内联

说明

coder.inline(option) 控制在生成的 C/C++ 代码中当前函数的内联,如 option 所指定。

  • coder.inline("always") 指示代码生成器在生成的代码中将函数调用替换为被调函数的内容(函数体)。

  • coder.inline("never") 可阻止在生成的代码中内联当前函数。

  • coder.inline("default") 指示代码生成器使用内部启发式方法来确定是否内联当前函数。

内联消除了函数调用的开销,并为进一步优化生成的代码提供了机会,但也可能生成更庞大、更复杂的代码。相反,防止内联可以简化 MATLAB® 代码和生成的代码之间的映射。默认情况下,代码生成器使用内部启发式方法来确定是否内联当前函数。通常,这些启发式方法会产生高度优化的代码。仅当需要微调这些优化时,才在 MATLAB 函数中显式使用 coder.inline 优化指令。

要控制代码生成器在每个单独调用点上的内联行为,请使用 coder.inlineCallcoder.nonInlineCall

示例

示例

全部折叠

创建一个入口函数 inliningEntryPoint,该函数调用两个局部函数 local_Inlinelocal_NoInline。这两个局部函数都返回输入值的平方,但 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.2
 * C/C++ source code generated on  : 09-Aug-2025 12:54:34
 */

/* 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 指令根据输入参量等参数来控制函数内联。

创建入口函数 conditionalInlining,该函数调用局部函数 simpleDivision。仅当两个输入参量均为标量时,才使用多个 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.2
 * C/C++ source code generated on  : 09-Aug-2025 12:56:14
 */

/* 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.2
 * C/C++ source code generated on  : 09-Aug-2025 12:56:17
 */

/* 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") 指令。请参阅Control Inlining to Fine-Tune Performance and Readability of Generated Code (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 选项对所有函数禁用内联。

  • 与从 MATLAB 函数生成的 C/C++ 代码相比,从您编写的函数生成的 C/C++ 代码可能有不同速度和可读性要求。附加的全局设置使您能够控制生成的代码库的这两部分的内联。请参阅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 中推出

全部展开