Устраните избыточные копии переменных в сгенерированном коде

Когда избыточные копии происходят

Во время генерации кода C/C++ генератор кода проверяет на операторы, которые пытаются получить доступ к неинициализированной памяти. Если это обнаруживает пути к выполнению, где переменная используется, но потенциально не задана, это генерирует ошибку времени компиляции. Чтобы предотвратить эти ошибки, задайте переменные присвоением перед использованием их в операциях или возврате их как функциональные выходные параметры.

Обратите внимание, однако, что переменные присвоения не только копируют свойства присвоенных данных к новой переменной, но также и инициализируют новую переменную к присвоенному значению. Эта принудительная инициализация иногда приводит к избыточным копиям в коде C/C++. Чтобы устранить избыточные копии, задайте неинициализированные переменные при помощи функции coder.nullcopy, как описано в том, Как Устранить Избыточные Копии путем Определения Неинициализированных переменных.

Как устранить избыточные копии путем определения неинициализированных переменных

  1. Задайте переменную с coder.nullcopy.

  2. Инициализируйте переменную прежде, чем считать его.

    Когда неинициализированная переменная является массивом, необходимо инициализировать все его элементы прежде, чем передать массив как вход к функции или оператору — даже если функция или оператор не читают из неинициализированного фрагмента массива.

     Что происходит, если вы получаете доступ к неинициализированным данным?

Определение неинициализированных переменных

В следующем коде оператор присваивания X = zeros(1,N) не только задает X, чтобы быть вектором 1 на 5 действительных, удваивается, но также и инициализирует каждый элемент X, чтобы обнулить.

function X = withoutNullcopy %#codegen

N = 5;
X = zeros(1,N);
for i = 1:N
    if mod(i,2) == 0
        X(i) = i;
    elseif mod(i,2) == 1
        X(i) = 0;
    end
end

Эта принудительная инициализация создает дополнительную копию в сгенерированном коде. Чтобы устранить эти издержки, используйте coder.nullcopy в определении X:

function X = withNullcopy %#codegen

N = 5;
X = coder.nullcopy(zeros(1,N));
for i = 1:N
    if mod(i,2) == 0
        X(i) = i;
    else
        X(i) = 0;
    end
end