为 C/C++ 代码生成定义变量的最佳做法

您所在的位置:网站首页 matlab定义 为 C/C++ 代码生成定义变量的最佳做法

为 C/C++ 代码生成定义变量的最佳做法

2022-11-13 15:35| 来源: 网络整理| 查看: 265

为 C/C++ 代码生成定义变量的最佳做法在使用变量之前通过赋值来定义变量

对于 C/C++ 代码生成,应显式且明确地定义变量的类、大小和复/实性,然后才能在运算中使用这些变量或将它们作为输出返回。通过赋值定义变量,但请注意,赋值不仅会复制值,还会将该值表示的大小、类和复/实性复制到新变量。例如:

赋值 定义:a = 14.7;将 a 定义为双精度实数标量。b = a;使用 a(双精度实数标量)的属性定义 b。c = zeros(5,2);将 c 定义为由双精度实数值构成的 5×2 数组。d = [1 2 3 4 5; 6 7 8 9 0];将 d 定义为由双精度实数值构成的 5×2 数组。y = int16(3);将 y 定义为 16 位整数实数标量。

以这种方式定义属性,在 C/C++ 代码生成期间便会在所需的执行路径上定义该变量。

赋给变量的数据可以是标量、矩阵或结构体。如果您的变量是结构体,请显式定义每个字段的属性。

将新变量初始化为已分配数据的值有时会导致生成的代码中出现冗余副本。要避免冗余副本,可以使用 coder.nullcopy 构造来定义变量而不初始化其值,如Eliminate Redundant Copies of Variables in Generated Code中所述。

定义变量时,它们默认为局部变量;它们不会在函数调用之间持久存在。要使变量持久存在,请参阅 persistent。

例 1. 为多个执行路径定义一个变量

以如下 MATLAB® 代码为例:

... if c > 0 x = 11; end % Later in your code ... if c > 0 use(x); end ...此处,x 仅在 c > 0 时赋值,且仅在 c > 0 时使用。此代码可在 MATLAB 中正常工作,但在代码生成期间会生成编译错误,因为它检测到 x 在某些执行路径上未定义(当 c 0 x = 11; end % Later in your code ... if c > 0 use(x); end ...例 2. 定义结构体中的字段

以如下 MATLAB 代码为例:

... if c > 0 s.a = 11; disp(s); else s.a = 12; s.b = 12; end % Try to use s use(s); ...此处,if 语句的第一部分仅使用字段 a,else 子句使用字段 a 和 b。此代码可在 MATLAB 中正常工作,但在 C/C++ 代码生成期间会生成编译错误,因为它检测到结构体类型不匹配。为了防止此错误,请不要在对某结构体执行某些操作后向该结构体添加字段。有关详细信息,请参阅 用于代码生成的结构体定义。

要使此代码适合 C/C++ 代码生成,请在使用 s 之前定义其所有字段。

... % Define all fields in structure s s = struct(‘a’,0, ‘b’, 0); if c > 0 s.a = 11; disp(s); else s.a = 12; s.b = 12; end % Use s use(s); ...对变量重新赋值时务必小心

通常,对于 C/C++ 代码生成,您应该遵循“一个变量/一个类型”规则;也就是说,每个变量必须具有特定的类、大小和复/实性。通常,如果在初始赋值后对变量属性重新赋值,则在代码生成期间会出现编译错误,但也有例外,如变量属性的重新赋值中所述。

在变量定义中使用类型转换运算符

默认情况下,常量的类型为 double。要定义其他类型的变量,可以在变量定义中使用类型转换运算符。例如,以下代码将变量 y 定义为整数:

... x = 15; % x is of type double by default. y = uint8(x); % y has the value of x, but cast to uint8. ...在对索引变量赋值之前定义矩阵

从 MATLAB 生成 C/C++ 代码时,不能通过写入超出变量当前大小的元素来扩展变量。这种索引操作会产生运行时错误。必须先定义矩阵,然后再为矩阵的元素赋值。

例如,代码生成不允许以下初始赋值:

g(3,2) = 14.6; % Not allowed for creating g % OK for assigning value once created

有关索引矩阵的详细信息,请参阅在代码生成的矩阵索引操作方面与 MATLAB 的不兼容性。

使用常量值向量对数组进行索引

最佳做法是使用常量值向量对数组进行索引,而不是使用包含非常量对象的范围。

在某些情况下,代码生成器无法确定包含 colon 运算符的表达式是固定大小还是可变大小。请使用常量值向量对数组进行索引,以防止它们在生成的代码中不必要地创建为可变大小数组。

例如,数组 out 是使用通过随机行向量 A 进行索引的变量 i 创建的。

... % extract elements i through i+5 for processing A = rand(1,10); out = A(i:i+5); % If i is unknown at compile time, out is variable-size ...

如果 i 是编译时常量值,代码生成器将为 out 生成固定大小对象。如果 i 在编译时未知,代码生成器将在生成的代码中为 out 生成可变大小数组。

为了防止代码生成器创建可变大小数组,上述代码段重写为以下模式:

... % extract elements i through i+5 for processing A = rand(1,10); out = A (i+(0:5)); % out is fixed-size, even if i is unknown at compile time ...

此模式能够在迭代器值在编译时未知的情况下生成固定大小数组。推荐重写的另一个示例如下:

width = 25; A = A(j-width:j+width); % A is variable-size, if j is unknown at compile time fsA = A(j+(-width:width)); % This makes A fixed-size, even if j is unknown at compile time ... 另请参阅

coder.nullcopy | persistent

相关主题Eliminate Redundant Copies of Variables in Generated Code用于代码生成的结构体定义在代码生成的矩阵索引操作方面与 MATLAB 的不兼容性Avoid Data Copies of Function Inputs in Generated Code


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3