主要内容

生成代码中数组的表示

代码生成器生成C/ c++数组定义,这些定义取决于数组元素类型以及数组使用静态还是动态内存分配。使用生成的数组实现将数组与生成的代码连接起来。

数组的内存分配需要不同的实现:

  • 对于固定大小的数组或大小受预定义内存阈值限制的可变大小数组,生成的C/ c++定义由固定大小的元素数组和存储数组元素总数的size向量组成。在某些情况下,固定大小的元素数组和大小向量存储在结构中。这个数组的内存来自程序堆栈,是静态分配的。

  • 对于在编译时大小为无界或界限超过预定义阈值的数组,生成的C定义由称为emxArray.生成的c++定义由编码器:数组类模板。

预定义的阈值大小(以字节为单位)在配置对象中指定。该参数的默认值为65536.看到DynamicMemoryAllocationThreshold编码器。MexCodeConfig编码器。CodeConfig,或编码器。EmbeddedCodeConfig

对于动态分配的数组,运行时分配的大小是基于当前数组大小设置的。在程序执行期间,当超过运行时分配的大小时,生成的代码将从堆中重新分配额外的内存空间,并将其添加到动态数组存储中。

下表列出了生成代码中数组表示的一些典型情况。

算法描述和数组大小

MATLAB®函数

生成C/ c++代码

创建一个固定大小的1 × 500行向量。该数组是MATLAB函数的输出

生成的代码将内存分配给程序堆栈上固定大小的向量。

函数B = create_vec0% # codegenB = 0 (1500);结束
void create_vec0(double B[500]) {memset(&B[0], 0, 500U * sizeof(double));}

数组是生成代码中函数的输入。

创建一个固定大小的1 × 20行向量。将数组声明为可变大小,边界为500个元素。将这个可变大小的数组分配给输入数组。

该数组在大小阈值范围内绑定,并且是生成代码中函数的输入。

函数create_vec1 (B)% # codegenA = 0 (1,20);coder.varsize (“一个”,[1 500],[0 1]);B = a;结束
void create_vec1(double B_data[], int B_size[2]) {int i;B_size[0] = 1;B_size[1] = 20;For (i = 0;I < 20;i++) {B_data[i] = 1.0;}}

请注意

生成的代码包括函数参数中的输入。

创建一个本地固定大小的1 × 20000行向量。将数组声明为变量大小,边界为30,000个元素。

可变大小数组超过预定义的动态内存分配阈值。该数组存储在堆内存中。

生成的代码在函数参数中包含输出数组。

函数B = create_vec2()% # codegenA = ones(1,20000);coder.varsize (“一个”,[1 30000], [0 1]);B = [1 a];结束

C:

void create_vec2(emxArray_real_T *B) {double *B_data;int我;i = B->size[0] * B->size[1];B->大小[0]= 1;B->大小[1]= 20001;emxEnsureCapacity_real_T (B,我);B_data = B->data;B_data[0] = 1.0;For (i = 0;I < 20000; i++) { B_data[i + 1] = 1.0; } }

c++:

void create_vec2(coder::array &B) {B.set_size(1,20001);B[0] = 1.0;For (int i{0};I < 20000;i++) {B[i + 1] = 1.0;}}

创建一个数组,其大小由一个无界整数输入决定。

生成的数组大小是未知的,在编译时是无界的。

函数Y = create_vec3(n)% # codegenY = ones(1,n,“int8”);

C:

void create_vec3(double n, emxArray_int8_T *y) {int i;int loop_ub_tmp;Signed char *y_data;I = y->size[0] * y->size[1];Y ->大小[0]= 1;Loop_ub_tmp = (int)n;Y ->size[1] = (int)n;emxEnsureCapacity_int8_T (y,我);Y_data = y->data;For (i = 0; i < loop_ub_tmp; i++) { y_data[i] = 1; } }

c++:

void create_vec3(double n, coder::array &y) {int loop_ub_tmp;Loop_ub_tmp = static_cast(n);loop_ub_tmp y.set_size(1日);For (int i{0};I < loop_ub_tmp;I ++) {y[I] = 1;}}

要了解emxArray数据结构,见在生成的函数接口中使用C数组

要了解编码器:数组类模板,请参见在生成的函数接口中使用动态分配的c++数组

自定义生成接口

默认情况下,生成的c++代码使用编码器:数组模板来实现动态分配的数组。您可以选择生成使用C风格的c++代码emxArray实现动态分配数组的数据结构。生成C样式emxArray数据结构,执行以下任一操作:

要在生成的代码中为可变大小的数组创建动态分配的数组,请执行以下操作之一:

  • 设置DynamicMemoryAllocation旗帜“总是”“阈值”

  • 另外,在MATLAB编码器应用,在内存选项卡中,在下拉列表中选择所需选项可变大小数组的动态内存分配选择。

默认情况下,在阈值大小范围内的数组不会在生成的代码中使用动态分配。您也可以关闭动态内存分配,并修改动态内存分配阈值。看到控制可变大小数组的内存分配

另请参阅

|||

相关的话题