主要内容

避免在生成的代码中存在函数输入的数据副本

通过编写使用相同变量作为输入和输出的 MATLAB® 函数,可以在生成的代码中减少数据副本数量。以下代码模式指示代码生成器按引用而不是按值传递变量,从而减少生成代码的内存使用量和执行时间。以下代码优化称为引用参数优化

应用引用参数优化

定义 MATLAB 函数 foo,该函数使用变量 A 表示输入和输出。

function A = foo(A,B) %#codegen
A = A * B;
end

当您在源 MATLAB 函数中将一个变量同时用作输入和输出时,代码生成器将此变量映射到生成的 C/C++ 函数中的按引用传递参数。例如,在为 foo 生成的代码中,输入参数 A 使用指针进行按引用传递:

...
/* Function Definitions */
void foo(double *A, double B)
{
    *A *= B;
}
...

此优化可避免在调用点传递数据时将输入复制到临时变量,从而减少内存使用量和执行时间。当按引用传递的变量是大型数据结构体时,这种减少尤其显著。

相反,假设您创建一个函数 foo2,该函数执行与 foo 相同的计算,但使用新变量 y 来返回输出。

function y = foo2(A,B) %#codegen
y = A * B;
end

生成的代码不使用引用参数优化。它按值传递输入,并返回输出的值。

...
/* Function Definitions */
double foo2(double A, double B)
{
   return A * B;
}
...

常量输入的特殊行为

引用参数优化不适用于常量输入。如果同一变量既作为输入又作为输出,并且输入是常量,则代码生成器会将输出视为单独的变量。以函数 foo 为例:

function A = foo(A,B) %#codegen
A = A * B;
end

生成代码,其中 A 具有常量值 2

codegen -config:lib foo -args {coder.Constant(2) 3} -report

生成的代码省略常变量 A,按值传递非常变量 B,并按值返回输出。

...
/* Function Definitions */
double foo(double B)
{
  return 2.0 * B;
}
...

另请参阅

主题