Вы генерируете код, и он содержит несколько, дубликаты тех же функций, только с незначительными различиями, такими как модификации к функциональной подписи. Например, ваш сгенерированный код может содержать функции под названием foo
и b_foo
. Дублирующиеся функции могут сделать сгенерированный код более трудным анализировать и справиться.
Дублирующиеся функции в сгенерированном коде являются результатом функциональных специализаций. Генератор кода специализирует функции, когда он обнаруживает, что они отличаются на различных сайтах вызова:
Количество переменных ввода или вывода.
Тип переменных ввода или вывода.
Размер переменных ввода или вывода.
Значения входных переменных.
В некоторых случаях эти специализации необходимы для сгенерированного кода C/C++, потому что функции C/C++ не имеют той же гибкости как функции MATLAB®. В других случаях генератор кода специализирует функции, чтобы оптимизировать сгенерированный код или из-за отсутствия информации.
В определенных случаях можно изменить код MATLAB, чтобы избежать генерации дублирующихся функций.
Можно определить, создал ли генератор кода дублирующиеся функции путем осмотра отчета генерации кода или в Simulink®, отчете функции MATLAB. Отчет показывает список дублирующихся функций под функцией точки входа. Например:
Если ваш код MATLAB вызывает функцию и передает входные параметры нескольких различных размеров, генератор кода может создать специализации функции для каждого размера. Чтобы избежать этой проблемы, используйте coder.varsize
, чтобы явным образом объявить вход как переменный размер. Например, этот код использует coder.varsize
, чтобы не создавать несколько копий функционального indexOf
:
function [out1, out2] = test1(in) a = 1:10; b = 2:40; coder.varsize('a'); % Removing these two lines causes coder.varsize('b'); % the indexOf fn to be duplicated out1 = indexOf(a, in); out2 = indexOf(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