MATLAB® Coder™ переводит и оптимизирует код MATLAB с динамическим контролем типов на C/C++ со статическим контролем типов. Статически типизированные языки требуют, чтобы типы переменных были явным образом объявлены, и эти типы определяются во время компиляции. Определенные изменения и оптимизация, выполняемая генератором кода, включают использование типов данных MATLAB и функций в сгенерированном коде. Для получения дополнительной информации о типах данных и функциях, поддерживавших для генерации кода, смотрите Функции Определения данных и языка MATLAB, Поддерживавшие для Генерации кода C/C++.
Эти изменения и оптимизация заставляют сгенерированный код появляться по-другому, чем код MATLAB. Сгенерированный код не может сопоставить непосредственным способом с вашим кодом MATLAB ни из-за одного следующего:
Примечание
В зависимости от вашего исходного кода эти случаи могут произойти немного по-другому, чем, как их показывают здесь.
MATLAB Coder генерирует автономный код C/C++ и код MEX из кода MATLAB. Одна функция в вашем коде MATLAB может быть переведена в несколько функций в сгенерированном коде. Две или больше функции в вашем коде MATLAB могут также стать одним телом функции в сгенерированном коде. Этот процесс называется функциональным встраиванием. По умолчанию генератор кода использует внутреннюю эвристику, чтобы определить, встроить ли ваши функции или нет. Для получения дополнительной информации смотрите coder.inline
и управляйте встраиванием, чтобы подстроить эффективность и удобочитаемость сгенерированного кода.
Выходные параметры функции MATLAB могут стать возвращаемыми значениями в C или могут стать входными параметрами передачи ссылкой.. Один скалярный выход в вашем коде MATLAB обработан как возвращаемое значение в сгенерированном коде.
Функциональный addOne
имеет входную переменную x
и выходная переменная y
. В данном примере x
имеет тип double
.
function y = addOne(x) y = x + 1; end
Код, сгенерированный для отрывка, показывают здесь:
double addOne(double x) { return x + 1.0; }
Вход к функциональному addOne
X
, обработан как переменная передачи значением в сгенерированном коде. Выходной параметр функции MATLAB возвращен значением в сгенерированном коде.
Для массивов могут быть переданы ссылкой выходные параметры. Фрагмент кода, показанный здесь, использует double
вход x
и массив выход y
.
function y = addMat(x) z = [1:100]; y = z + x; end
Выходная переменная y
переводится в переменную типа массив передачи ссылкой в сгенерированном коде, показанном здесь:
void addMat(double x, double y[100]) { int i; for (i = 0; i < 100; i++) { y[i] = ((double)i + 1.0) + x; } }
Для функций точки входа, которые имеют несколько выходных переменных, выходные параметры могут быть переданы ссылкой в сгенерированном коде. Этот фрагмент кода имеет два double
скалярные выходные параметры, y
и z
, с double
скалярный вход x
.
function [z,y] = splitOne(x) y = x + 1; z = x + 2; end
Выходные переменные y
и z
переводятся в передачу ссылкой переменные в сгенерированном коде:
void splitOne(double x, double *z, double *y) { *y = x + 1.0; *z = x + 2.0; }
Для получения дополнительной информации о поведении передачи параметров функций точки входа в сгенерированном коде смотрите, Развертывают Сгенерированный код.
Постоянные значения в вашем коде не могут быть сохранены в сгенерированном коде. Эти значения могут быть удалены, чтобы оптимизировать сгенерированный код. Сворачивание констант удаляет расчеты, которые могут присутствовать в вашем коде MATLAB и заменяют расчеты на результат вместо этого. Для получения дополнительной информации смотрите Сворачивание констант.
Рассмотрите этот фрагмент кода:
function y = removeConst x = ones(10); y = x + 1; end
Генератор кода удаляет постоянный матричный x
сохранять память и присвоения постоянное значение как результат. Сгенерированный код выглядит так код:
void removeConst(double y[100]) { int i; for (i = 0; i < 100; i++) { y[i] = 2.0; } }
Неиспользованные входные параметры или постоянные входные параметры к функциям точки незаписи в вашем коде MATLAB удалены из тел функции в сгенерированном коде.
Функциональные специализации генератором кода могут изменить функцию в версию, где входной тип, размер, сложность или значение могут быть настроены для конкретного вызова функции. Это сделано, чтобы произвести эффективный код С за счет дублирования кода. Для получения дополнительной информации смотрите Специализированные Функции или Классы.
В предыдущем экземпляре, получая доступ к матрице требует дополнительных строк кода на C/C++. 10
- 10
матрица представлена как массив 100 double
элементы в сгенерированном коде. for
цикл используется, чтобы получить доступ ко всем элементам массива в этом случае. C/C++ не поддерживает много операций над матрицей, таким образом, генератор кода преобразует матрицы и операции на матрицах к массивам и методах как for
циклы, чтобы получить доступ к тем массивам.
Сгенерированный код может использовать стандартные библиотеки для C, чтобы выполнить математические операции или другие функции в вашем коде MATLAB. Для списка поддерживаемых функций языка смотрите Функции языка MATLAB, Поддерживавшие для Генерации кода C/C++.
Для генерации кода массив может быть фиксированным размером или переменным размером. Массивы переменного размера могут появиться в различных форматах в сгенерированном коде. Код может быть сгенерирован для массива фиксированного размера, если генератор кода может определить размер массива. Генерация кода также допустима для массива фиксированного размера с верхней границей. Динамически выделенные массивы также сгенерированы в определенных случаях. Смотрите Генерацию кода для Массивов Переменного Размера.
Генерация кода для фиксированного размера и массивов переменного размера может дать к следующим объявлениям переменной в сгенерированном коде:
double x[10]; // Fixed-size array double y_data[20]; int y_size[2]; // y_data and y_size denote an upper-bounded array emxArrayReal_T *z; // Dynamically allocated array
Если ваш код MATLAB содержит локальные переменные, которые занимают большую память, то в сгенерированном коде они могут быть объявлены как локальные переменные, статические локальные переменные, или как переменные в struct
это передается в вашу функцию точки входа в вашем сгенерированном коде. Можно управлять этим преобразованием путем управления памятью, которая выделяется для сгенерированного кода. Смотрите Использование Стекового пространства Управления.
Чтобы реализовать массивы ячеек в сгенерированном коде, генератор кода может перевести их как struct
, статический массив или динамический массив. Для получения дополнительной информации смотрите Генерацию кода для Массивов ячеек.
Генератор кода может произвести две функции обслуживания, инициализировать и завершить работу, если они необходимы. Можно искать эти функции во вкладке Generated Code в отчете генерации кода. Инициализировать функция инициализирует состояние, с которым работают сгенерированные функции точки входа C/C++. Оконечная функция освобождает выделенную память и выполняет другие операции очистки. Для получения дополнительной информации смотрите, что Сгенерированное Использование Инициализирует и Отключает Функции