主要内容

避免在生成的代码中出现重复的函数

问题

您生成的代码包含相同函数的多个副本,只有轻微的差异,例如对函数签名的修改。例如,您生成的代码可能包含调用喷火而且b_foo.重复的函数会使生成的代码更难分析和管理。

导致

生成的代码中重复的函数是函数特殊化的结果。当代码生成器检测到函数在不同的调用点存在差异时,通过以下方式对函数进行专门化:

  • 输入或输出变量的个数。

  • 输入或输出变量的类型。

  • 输入或输出变量的大小。

  • 输入变量的值。

在某些情况下,这些专门化对于生成的C/ c++代码是必要的,因为C/ c++函数没有MATLAB那样的灵活性®功能。在其他情况下,代码生成器专门化函数以优化生成的代码或因为缺少信息。

解决方案

在某些情况下,您可以更改MATLAB代码以避免生成重复的函数。

使用代码生成报告识别重复函数

您可以通过检查代码生成报告或在Simulink中确定代码生成器是否创建了重复的函数万博1manbetx®, MATLAB函数报告。该报告在入口点函数下面显示了重复函数的列表。例如:

为多个输入大小生成重复函数

如果MATLAB代码多次调用一个函数并传递不同大小的输入,代码生成器可以为每个大小创建函数的专门化。要避免此问题,请使用coder.ignoreSize在函数输入上。例如,此代码使用coder.ignoreSize避免创建函数的多个副本indexOf

函数[out1, out2] = test1(in) a = 1:10;B = 2:40;%没有编码器。生成ignoreSize重复函数out1 = indexOf(code . ignoresize (a), in);out2 = indexOf(code . ignoresize (b), in);结束函数index = indexOf(数组,值)code .inline(“永远”);I = 1:数字(数组)如果数组(i) ==值索引= i;返回结束结束指数= -1;返回结束

要生成代码,输入:

codegentest1配置:自由报告arg游戏{1}

为不同的输入值生成重复的函数

如果MATLAB代码调用一个函数并传递多个不同的常量输入,代码生成器可以为每个不同的常量创建函数的专门化。在这种情况下,使用coder.ignoreConst指示代码生成器不要将值视为不可变常数。例如:

函数[out3, out4] = test2(in) c = [“一个”“b”“c”];如果In > 0 c(2)=' d '结束out3 = indexOf(c, code . ignoreconst (“一个”));out4 = indexOf(c, code . ignoreconst (“b”));结束函数index = indexOf(数组,值)code .inline(“永远”);I = 1:数字(数组)如果数组(i) ==值索引= i;返回结束结束指数= -1;返回结束

要生成代码,输入:

codegentest2配置:自由报告arg游戏{1}

为不同数量的输出生成相同的函数

如果MATLAB代码调用一个函数,并且在不同的调用点接受不同数量的输出,代码生成器可以为每个调用产生专门化。例如:

[a b] = foo();C = foo();

若要使每个调用返回相同数量的输出并避免重复函数,请使用符号:

[a b] = foo();[c, ~] = foo();

另请参阅

||

相关的话题