Количество копий в созданном коде можно уменьшить, написав функции, использующие ту же переменную, что и входные и выходные данные. Например:
function A = foo( A, B ) %#codegen A = A * B; end
В этой практике кодирования используется оптимизация эталонных параметров. Когда переменная действует как входная, так и выходная, сгенерированный код передает переменную по ссылке, а не избыточно копирует входные данные во временную переменную. В предыдущем примере ввод A передается по ссылке в сгенерированном коде, поскольку он также действует как вывод для функции foo:
...
/* Function Definitions */
void foo(double *A, double B)
{
*A *= B;
}
...Оптимизация эталонных параметров уменьшает использование памяти и время выполнения, особенно когда переменная, передаваемая по ссылке, является большой структурой данных. Чтобы получить эти преимущества в месте вызова, вызовите функцию с той же переменной, что и вход и выход.
Напротив, предположим, что вы переписываете функцию foo без оптимизации:
function y = foo2( A, B ) %#codegen y = A * B; end
Сгенерированный код передает входные данные по значению и возвращает значение выходного сигнала:
...
/* Function Definitions */
double foo2(double A, double B)
{
return A * B;
}
...В некоторых случаях выходные данные функции не могут быть модифицированной версией ее входных данных. Если вводимые данные не используются позже в функции, можно изменить код для работы с вводимыми данными, а не с копией вводимых данных. Одним из методов является создание дополнительных возвращаемых значений для функции. Например, рассмотрим код:
function y1=foo(u1) %#codegen x1=u1+1; y1=bar(x1); end function y2=bar(u2) % Since foo does not use x1 later in the function, % it would be optimal to do this operation in place x2=u2.*2; % The change in dimensions in the following code % means that it cannot be done in place y2=[x2,x2]; end
Код можно изменить, чтобы исключить избыточные копии.
function y1=foo(u1) %#codegen u1=u1+1; [y1, u1]=bar(u1); end function [y2, u2]=bar(u2) u2=u2.*2; % The change in dimensions in the following code % still means that it cannot be done in place y2=[u2,u2]; end
Оптимизация ссылочных параметров не применяется к постоянным входам. Если одна и та же переменная является входом и выходом, а вход является постоянным, генератор кода рассматривает выход как отдельную переменную. Например, рассмотрим функцию foo:
function A = foo( A, B ) %#codegen A = A * B; end
Создать код, в котором A имеет постоянное значение 2.
codegen -config:lib foo -args {coder.Constant(2) 3} -report
Созданный код определяет константу A и возвращает значение выходного сигнала.
...
#define A (2.0)
...
double foo(double B)
{
return A * B;
}
...