在生成的代码中按引用或按值传递结构体参量
此示例说明如何控制生成的入口函数的结构体参量是按引用传递还是按值传递。
按引用传递使用指针来访问结构体参量。如果函数写入输入结构体的元素,它会覆盖输入值。按值传递会生成输入或输出结构体参量的副本。要减少内存使用量和执行时间,请使用按引用传递。
如果某结构体参量既是输入又是输出,则生成的入口函数按引用传递参量。生成的 MEX 函数按引用传递结构体参量。对于 MEX 函数输出,您无法指定要按值传递结构体参量。
为独立代码生成指定按引用或按值传递
默认情况下,代码生成器在独立代码中按引用传递结构体参量。当您生成独立代码时,可以通过以下方法之一指示代码生成器按值传递结构体参量:
在独立代码配置对象中,将
PassStructByReference属性设置为false。在“代码生成设置”对话框中,清除Pass structures by reference to entry-point functions复选框。
按引用传递输入结构体参量
编写具有输入结构体参量的 MATLAB® 函数 my_struct_in。
type my_struct_in.mfunction y = my_struct_in(s) %#codegen y = s.f;
在 MATLAB 工作区中定义结构体变量 mystruct。
mystruct = struct('f', 1:4);为 C 静态库创建一个代码生成配置对象。
cfg = coder.config('lib');指定要按引用传递结构体参量。
cfg.PassStructByReference = true;
生成代码。指定输入参量的类型为变量 mystruct。
codegen -config cfg -args {mystruct} my_struct_in
Code generation successful.
查看生成的 C 代码。
type codegen/lib/my_struct_in/my_struct_in.c/*
* File: my_struct_in.c
*
* MATLAB Coder version : 25.2
* C/C++ source code generated on : 09-Aug-2025 10:02:17
*/
/* Include Files */
#include "my_struct_in.h"
#include "my_struct_in_types.h"
/* Function Definitions */
/*
* Arguments : const struct0_T *s
* double y[4]
* Return Type : void
*/
void my_struct_in(const struct0_T *s, double y[4])
{
y[0] = s->f[0];
y[1] = s->f[1];
y[2] = s->f[2];
y[3] = s->f[3];
}
/*
* File trailer for my_struct_in.c
*
* [EOF]
*/
为 my_struct_in 生成的函数签名是
void my_struct_in(const struct0_T *s, double y[4])
my_struct_in 按引用传递输入结构体 s。
按值传递输入结构体参量
指定要按值传递结构体参量。
cfg.PassStructByReference = false;
生成代码。指定输入参量的类型为变量 mystruct。
codegen -config cfg -args {mystruct} my_struct_in
Code generation successful.
查看生成的 C 代码。
type codegen/lib/my_struct_in/my_struct_in.c/*
* File: my_struct_in.c
*
* MATLAB Coder version : 25.2
* C/C++ source code generated on : 09-Aug-2025 10:02:28
*/
/* Include Files */
#include "my_struct_in.h"
#include "my_struct_in_types.h"
/* Function Definitions */
/*
* Arguments : const struct0_T s
* double y[4]
* Return Type : void
*/
void my_struct_in(const struct0_T s, double y[4])
{
y[0] = s.f[0];
y[1] = s.f[1];
y[2] = s.f[2];
y[3] = s.f[3];
}
/*
* File trailer for my_struct_in.c
*
* [EOF]
*/
为 my_struct_in 生成的函数签名是
void my_struct_in(const struct0_T s, double y[4]
my_struct_in 按值传递输入结构体 s。
按引用传递输出结构体参量
编写具有输出结构体参量的 MATLAB 函数 my_struct_out。
type my_struct_out.mfunction s = my_struct_out(x) %#codegen s.f = x;
在 MATLAB 工作区中定义变量 a。
a = 1:4;
为 C 静态库创建一个代码生成配置对象。
cfg = coder.config('lib');指定要按引用传递结构体参量。
cfg.PassStructByReference = true;
生成代码。指定输入参量的类型为变量 a。
codegen -config cfg -args {a} my_struct_out
Code generation successful.
查看生成的 C 代码。
type codegen/lib/my_struct_out/my_struct_out.c/*
* File: my_struct_out.c
*
* MATLAB Coder version : 25.2
* C/C++ source code generated on : 09-Aug-2025 10:02:32
*/
/* Include Files */
#include "my_struct_out.h"
#include "my_struct_out_types.h"
/* Function Definitions */
/*
* Arguments : const double x[4]
* struct0_T *s
* Return Type : void
*/
void my_struct_out(const double x[4], struct0_T *s)
{
s->f[0] = x[0];
s->f[1] = x[1];
s->f[2] = x[2];
s->f[3] = x[3];
}
/*
* File trailer for my_struct_out.c
*
* [EOF]
*/
为 my_struct_out 生成的函数签名是
void my_struct_out(const double x[4], struct0_T *s)
my_struct_out 按引用传递输出结构体 s。
按值传递输出结构体参量
指定要按值传递结构体参量。
cfg.PassStructByReference = false;
生成代码。指定输入参量的类型为变量 a。
codegen -config cfg -args {a} my_struct_out
Code generation successful.
查看生成的 C 代码。
type codegen/lib/my_struct_out/my_struct_out.c/*
* File: my_struct_out.c
*
* MATLAB Coder version : 25.2
* C/C++ source code generated on : 09-Aug-2025 10:02:35
*/
/* Include Files */
#include "my_struct_out.h"
#include "my_struct_out_types.h"
/* Function Definitions */
/*
* Arguments : const double x[4]
* Return Type : struct0_T
*/
struct0_T my_struct_out(const double x[4])
{
struct0_T s;
s.f[0] = x[0];
s.f[1] = x[1];
s.f[2] = x[2];
s.f[3] = x[3];
return s;
}
/*
* File trailer for my_struct_out.c
*
* [EOF]
*/
为 my_struct_out 生成的函数签名是
struct0_T my_struct_out(const double x[4])
my_struct_out 返回输出结构体。
按引用传递输入和输出结构体参量
当某参量既是输入又是输出时,即使 PassStructByReference 为 false,生成的 C 函数也会按引用传递该参量。
编写 MATLAB 函数 my_struct_inout,它的一个结构体参量既是输入参量又是输出参量。
type my_struct_inout.mfunction [y,s] = my_struct_inout(x,s) %#codegen y = x + sum(s.f);
在 MATLAB 工作区中定义变量 a 和结构体变量 mystruct。
a = 1:4;
mystruct = struct('f',a);为 C 静态库创建一个代码生成配置对象。
cfg = coder.config('lib');指定要按值传递结构体参量。
cfg.PassStructByReference = false;
生成代码。指定第一个输入的类型为 a,第二个输入的类型为 mystruct。
codegen -config cfg -args {a, mystruct} my_struct_inout
Code generation successful.
查看生成的 C 代码。
type codegen/lib/my_struct_inout/my_struct_inout.c/*
* File: my_struct_inout.c
*
* MATLAB Coder version : 25.2
* C/C++ source code generated on : 09-Aug-2025 10:02:39
*/
/* Include Files */
#include "my_struct_inout.h"
#include "my_struct_inout_types.h"
#include <emmintrin.h>
/* Function Definitions */
/*
* Arguments : const double x[4]
* const struct0_T *s
* double y[4]
* Return Type : void
*/
void my_struct_inout(const double x[4], const struct0_T *s, double y[4])
{
__m128d r;
r = _mm_set1_pd(((s->f[0] + s->f[1]) + s->f[2]) + s->f[3]);
_mm_storeu_pd(&y[0], _mm_add_pd(_mm_loadu_pd(&x[0]), r));
_mm_storeu_pd(&y[2], _mm_add_pd(_mm_loadu_pd(&x[2]), r));
}
/*
* File trailer for my_struct_inout.c
*
* [EOF]
*/
为 my_struct_inout 生成的函数签名是
void my_struct_inout(const double x[4], const struct0_T *s, double y[4])
my_struct_inout 按引用传递结构体 s,即使 PassStructByReference 是 false。
另请参阅
codegen | coder.CodeConfig | coder.EmbeddedCodeConfig