coder.rref
指示要按引用传递的只读数据
说明
coder.rref( 表示 arg)arg 是按引用传递给外部 C/C++ 函数的只读表达式或变量。仅在 coder.ceval 调用中使用 coder.rref。
coder.rref 函数支持代码生成器对生成的代码进行优化。由于假定外部函数不写入 coder.rref(arg),因此代码生成器可以对 coder.ceval 调用前后发生的对 arg 赋值执行优化(如表达式折叠)。表达式折叠指将多项操作组合为一条语句,以避免使用临时变量并提高代码性能。
注意
代码生成器假定您通过 coder.rref(arg) 传递的内存为只读。为了避免不可预测的结果,C/C++ 函数不能写入此变量。
另请参阅 coder.ref 和 coder.wref。
coder.rref( 指示 arg,'gpu')arg 是 GPU 参量。此选项需要有效的 GPU Coder™ 许可证。如果 coder.ceval 调用 CUDA® GPU __device__ 函数,代码生成器将忽略 'gpu' 设定。
示例
将标量变量作为只读引用传递
假设 C 函数 addone,它返回常量输入加一之后的值:
double addone(const double* p) {
return *p + 1;
}C 函数将输入变量 p 定义为指向一个双精度常量的指针。
按引用将输入传递给 addone:
... y = 0; u = 42; y = coder.ceval('addone', coder.rref(u)); ...
将多个参量作为只读引用传递
... u = 1; v = 2; y = coder.ceval('my_fcn', coder.rref(u), coder.rref(v)); ...
将类属性作为只读引用传递
... x = myClass; x.prop = 1; y = coder.ceval('foo', coder.rref(x.prop)); ...
将结构体作为只读引用传递
要指示结构体类型在 C 头文件中定义,请使用 coder.cstructname。
假设有一个 C 函数 use_struct。此函数读取但不写入输入参量。
#include "MyStruct.h"
double use_struct(const struct MyStruct *my_struct)
{
return my_struct->f1 + my_struct->f2;
}
C 头文件 MyStruct.h 定义名为 MyStruct 的结构体类型:
#ifndef MYSTRUCT
#define MYSTRUCT
typedef struct MyStruct
{
double f1;
double f2;
} MyStruct;
double use_struct(const struct MyStruct *my_struct);
#endif在 MATLAB® 函数中,将结构体作为只读引用传递给 use_struct。要指示 s 的结构体类型具有在 C 头文件 MyStruct.h 中定义的名称 MyStruct,请使用 coder.cstructname。
function y = foo %#codegen y = 0; coder.updateBuildInfo('addSourceFiles','use_struct.c'); s = struct('f1',1,'f2',2); coder.cstructname(s,'MyStruct','extern','HeaderFile','MyStruct.h'); y = coder.ceval('use_struct', coder.rref(s));
要生成独立库代码,请输入:
codegen -config:lib foo -report
将结构体字段作为只读引用传递
... s = struct('s1', struct('a', [0 1])); y = coder.ceval('foo', coder.rref(s.s1.a)); ...
您也可以传递结构体数组的元素:
... c = repmat(struct('u',magic(2)),1,10); b = repmat(struct('c',c),3,6); a = struct('b',b); coder.ceval('foo', coder.rref(a.b(3,4).c(2).u)); ...
输入参数
限制
不能按引用传递以下数据类型:
类或 System object
元胞数组或元胞数组索引
如果某属性具有 get 方法、set 方法或验证器,或者是具有某些特性的 System object 属性,则您不能按引用将该属性传递给外部函数。请参阅某些属性不支持按引用传递。
提示
如果
arg是数组,则coder.rref(arg)提供数组第一个元素的地址。coder.rref(arg)函数不包含有关数组大小的信息。如果 C 函数需要知道数据的元素数量,请将该信息作为单独的参量进行传递。例如:coder.ceval('myFun',coder.rref(arg),int32(numel(arg));当您按引用向外部 C/C++ 函数传递结构体时,可以使用
coder.cstructname提供在 C 头文件中定义的 C 结构体类型的名称。在 MATLAB 中,
coder.rref会导致错误。要参数化您的 MATLAB 代码以使代码能够在 MATLAB 以及生成的代码中运行,请使用coder.target。您可以使用
coder.opaque来声明传递给外部 C/C++ 函数以及从该函数传回的变量。
扩展功能
版本历史记录
在 R2011a 中推出