exponenta event banner

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

Когда возникают избыточные копии

Во время генерации кода 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

См. также

Связанные темы