控制固定大小数组的动态内存分配
MATLAB® Coder™ 生成的代码为大小小于指定阈值的固定大小数组的程序堆栈分配内存。例如,在以下代码中,Z 是固定大小的 1×4 数组。
function Z = myfcn() Z = zeros(1,4); end
动态内存分配在堆上分配内存,而不是在程序堆栈上。请考虑为可能耗尽堆栈内存的大型固定大小数组分配动态内存。
动态内存分配可能导致所生成代码的执行速度变慢。
对固定大小数组启用动态内存分配
默认情况下,对固定大小数组禁用动态内存分配。使用以下方法之一启用它。
在用于代码生成的配置对象中,将
EnableDynamicMemoryAllocation和DynamicMemoryAllocationForFixedSizeArrays属性设置为true。在 MATLAB Coder 的内存设置中,选择启用动态内存分配和对固定大小数组启用动态内存分配。
对固定大小数组设置动态内存分配阈值
当对固定大小数组启用动态内存分配时,代码生成器会在堆上为大小(以字节为单位)大于或等于动态内存分配阈值的固定大小数组动态分配内存。
默认动态内存分配阈值为 64 KB。要配置阈值,请使用以下方法之一:
在用于代码生成的配置对象中,设置属性
DynamicMemoryAllocationThreshold的值。在 MATLAB Coder 的内存设置中,设置动态内存分配阈值的值。
为固定大小数组生成代码
定义一个 MATLAB 函数,该函数计算两个大型固定大小数组 a 和 b 的乘积。
function y = productLargeSize(a,b) y = a*b; end
cfg = coder.config('lib'); cfg.VerificationMode="SIL"; cfg.DynamicMemoryAllocationForFixedSizeArrays = true; t = coder.typeof(0,[1e4 1e4]); codegen productLargeSize -args {t,t} -config cfg - report
通过为固定大小数组启用动态内存分配,对数组 a 和 b 在堆上动态分配,从而防止堆栈溢出。
生成的代码
...
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;
...用法说明和限制
对固定大小数组启用动态内存分配时:
生成的代码中函数的输入和输出变量是:
coder::array变量,用于 C++ 代码生成。请参阅Use Dynamically Allocated C++ Arrays in Generated Function Interfaces。emxArray结构体,用于 C 代码生成。请参阅在生成的函数接口中使用动态分配的 C 数组。
将具有固定大小数组字段的
struct对象传递给coder.ceval或代码替换库 (CRL) 时,C/C++ 函数签名必须更新。
注意
GPU 代码生成不支持对固定大小数组启用动态内存分配。
另请参阅
coder.EmbeddedCodeConfig | coder.MexCodeConfig | coder.CodeConfig