Во время генерации кода C/C + + генератор кода проверяет наличие операторов, которые пытаются получить доступ к неинициализированной памяти. Если он обнаруживает пути выполнения, где используется переменная, но потенциально не определен, он генерирует ошибку времени компиляции. Чтобы предотвратить эти ошибки, определите переменные путем назначения, прежде чем использовать их в операциях или возвращать их как выходные данные функции.
Однако следует отметить, что назначения переменных не только копируют свойства назначенных данных в новую переменную, но также инициализируют новую переменную в назначенное значение. Такая принудительная инициализация иногда приводит к избыточным копиям в коде C/C + +. Чтобы исключить избыточные копии, определите неинициализированные переменные с помощью coder.nullcopy функция, как описано в разделе Как устранить избыточные копии путем определения неинициализированных переменных.
Определите переменную с помощью coder.nullcopy.
Инициализируйте переменную перед ее считыванием.
Если неинициализированная переменная является массивом, необходимо инициализировать все ее элементы перед передачей массива в качестве входных данных функции или оператора, даже если функция или оператор не считывает из неинициализированной части массива.
В следующем коде оператор присвоения 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