exponenta event banner

Различия во внешнем виде сгенерированного кода и кода MATLAB

MATLAB ® Coder™ преобразует и оптимизирует динамически типизированный код MATLAB в статически типизированный код C/C + +. Статически типизированные языки требуют явного объявления типов переменных, и эти типы определяются во время компиляции. Определенные изменения и оптимизации, выполняемые генератором кода, позволяют использовать типы данных и функции MATLAB в сгенерированном коде. Дополнительные сведения о типах данных и функциях, поддерживаемых для генерации кода, см. в разделах Определение данных и Языковые функции MATLAB, поддерживаемые для генерации кода C/C + +.

Эти изменения и оптимизации приводят к тому, что созданный код отображается иначе, чем код MATLAB. Сгенерированный код может не сопоставляться с кодом MATLAB по принципу «один к одному» из-за следующих причин:

Примечание

В зависимости от исходного кода эти случаи могут происходить несколько иначе, чем показано здесь.

Отображение функций MATLAB в функции C/C + +

Кодер MATLAB генерирует автономный код 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 преобразуется в переменную массива pass-by-reference в сгенерированном коде, показанном здесь:

    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/C + +. A10около-10 матрица представлена в виде массива из 100 double элементы в созданном коде. A 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, статический массив или динамический массив. Дополнительные сведения см. в разделе Создание кода для массивов ячеек.

Инициализация и завершение функций

Генератор кода может создать две хозяйственные функции, инициализировать и завершать, если они необходимы. Эти функции можно найти на закладке Сгенерированный код в отчете по созданию кода. Функция инициализации инициализирует состояние, в котором работают сгенерированные функции точки входа C/C + +. Функция завершения освобождает выделенную память и выполняет другие операции очистки. Дополнительные сведения см. в разделе Использование сгенерированных функций инициализации и завершения

См. также

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