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

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

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

Примечание

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

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

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;
    }

    Вход к функциональному addOneX, обработан как переменная передачи значением в сгенерированном коде. Выходной параметр функции 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++. Оконечная функция освобождает выделенную память и выполняет другие операции очистки. Для получения дополнительной информации смотрите, что Сгенерированное Использование Инициализирует и Отключает Функции

Смотрите также

Похожие темы