Вы генерируете код, и он содержит несколько, дубликаты тех же функций, только с незначительными различиями, такими как модификации к функциональной подписи. Например, ваш сгенерированный код может содержать функции под названием foo
и b_foo
. Дублирующиеся функции могут сделать сгенерированный код более трудным анализировать и справиться.
Дублирующиеся функции в сгенерированном коде являются результатом функциональных специализаций. Генератор кода специализирует функции, когда он обнаруживает, что они отличаются на различных сайтах вызова:
Количество переменных ввода или вывода.
Тип переменных ввода или вывода.
Размер переменных ввода или вывода.
Значения входных переменных.
В некоторых случаях эти специализации необходимы для сгенерированного кода C/C++, потому что функции C/C++ не имеют той же гибкости как MATLAB® функции. В других случаях генератор кода специализирует функции, чтобы оптимизировать сгенерированный код или из-за отсутствия информации.
В определенных случаях можно изменить код MATLAB, чтобы избежать генерации дублирующихся функций.
Можно определить, создал ли генератор кода дублирующиеся функции путем осмотра отчета генерации кода или в Simulink®, отчет функции MATLAB. Отчет показывает список дублирующихся функций под функцией точки входа. Например:
Если ваш код MATLAB вызывает функцию многократно и передает входные параметры различных размеров, генератор кода может создать специализации функции для каждого размера. Чтобы избежать этой проблемы, использовать coder.ignoreSize
на входном параметре функции. Например, этот код использование coder.ignoreSize
постараться не создавать несколько копий функционального indexOf
:
function [out1, out2] = test1(in) a = 1:10; b = 2:40; % Without coder.ignoreSize duplicate functions are generated out1 = indexOf(coder.ignoreSize(a), in); out2 = indexOf(coder.ignoreSize(b), in); end function index = indexOf(array, value) coder.inline('never'); for i = 1:numel(array) if array(i) == value index = i; return end end index = -1; return end
Сгенерировать код, введите:
codegen test1 -config:lib -report -args {1}
Если ваш код MATLAB вызывает функцию и передает несколько различных постоянных входных параметров, генератор кода может создать специализации функции для каждой различной константы. В этом случае использовать coder.ignoreConst
указать к генератору кода, чтобы не обработать значение как неизменяемую константу. Например:
function [out3, out4] = test2(in) c = ['a', 'b', 'c']; if in > 0 c(2)='d'; end out3 = indexOf(c, coder.ignoreConst('a')); out4 = indexOf(c, coder.ignoreConst('b')); end function index = indexOf(array, value) coder.inline('never'); for i = 1:numel(array) if array(i) == value index = i; return end end index = -1; return end
Сгенерировать код, введите:
codegen test2 -config:lib -report -args {1}
Если ваш код MATLAB вызывает функцию и принимает различное количество выходных параметров на различных сайтах вызова, генератор кода может произвести специализации для каждого вызова. Например:
[a b] = foo(); c = foo();
Чтобы сделать каждый пропущенный вызов тем же количеством выходных параметров и избежать дублирующихся функций, используйте ~
символ:
[a b] = foo(); [c, ~] = foo();
coder.ignoreConst
| coder.varsize
| coder.ignoreSize