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