避免在生成的代码中出现重复的函数
问题
您生成的代码包含相同函数的多个副本,只有轻微的差异,例如对函数签名的修改。例如,您生成的代码可能包含调用喷火
而且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();
另请参阅
coder.ignoreConst
|coder.varsize
|coder.ignoreSize