主要内容

控制固定大小数组的动态内存分配

MATLAB® Coder™ 生成的代码为大小小于指定阈值的固定大小数组的程序堆栈分配内存。例如,在以下代码中,Z 是固定大小的 1×4 数组。

function Z = myfcn()
Z = zeros(1,4);
end

动态内存分配在堆上分配内存,而不是在程序堆栈上。请考虑为可能耗尽堆栈内存的大型固定大小数组分配动态内存。

动态内存分配可能导致所生成代码的执行速度变慢。

对固定大小数组启用动态内存分配

默认情况下,对固定大小数组禁用动态内存分配。使用以下方法之一启用它。

  • 在用于代码生成的配置对象中,将 EnableDynamicMemoryAllocationDynamicMemoryAllocationForFixedSizeArrays 属性设置为 true

  • MATLAB Coder内存设置中,选择启用动态内存分配对固定大小数组启用动态内存分配

对固定大小数组设置动态内存分配阈值

当对固定大小数组启用动态内存分配时,代码生成器会在堆上为大小(以字节为单位)大于或等于动态内存分配阈值的固定大小数组动态分配内存。

默认动态内存分配阈值为 64 KB。要配置阈值,请使用以下方法之一:

  • 在用于代码生成的配置对象中,设置属性 DynamicMemoryAllocationThreshold 的值。

  • MATLAB Coder内存设置中,设置动态内存分配阈值的值。

为固定大小数组生成代码

定义一个 MATLAB 函数,该函数计算两个大型固定大小数组 ab 的乘积。

function y = productLargeSize(a,b)
  y = a*b;
end
生成 C 代码。
cfg = coder.config('lib');
cfg.VerificationMode="SIL";
cfg.DynamicMemoryAllocationForFixedSizeArrays = true;
t = coder.typeof(0,[1e4 1e4]);
codegen productLargeSize -args {t,t} -config cfg - report

通过为固定大小数组启用动态内存分配,对数组 ab 在堆上动态分配,从而防止堆栈溢出。

生成的代码

...
void tlargeSize(const emxArray_real_T *a, const emxArray_real_T *b,
                emxArray_real_T *y)
{
  const double *a_data;
  const double *b_data;
  double *y_data;
...

用法说明和限制

对固定大小数组启用动态内存分配时:

注意

GPU 代码生成不支持对固定大小数组启用动态内存分配。

另请参阅

| |

主题