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