Удаление динамического выделения памяти - из встроенной программы на C - PullRequest
4 голосов
/ 01 июня 2011

Я пытаюсь портировать библиотеку C на встроенную платформу (Xilinx Microblaze), и библиотека содержит некоторые вызовы malloc (), alloc (), calloc () и free ().

Эти функции вызывают необходимые дополнительные библиотеки для импорта во встроенную платформу и увеличивают программный код.

Как лучше всего удалить динамическое размещение из программы на Си и использовать только статическое распределение.Какие факты я должен выяснить, какие вычисления я должен сделать?Любые советы приветствуются.

пример вызова malloc:

   decoder->sync = malloc(sizeof(*decoder->sync));
     if (decoder->sync == 0)
       return -1;

Большое спасибо,

Рош

1 Ответ

5 голосов
/ 01 июня 2011

При преобразовании динамического выделения памяти (во время выполнения) в статические (время компиляции) необходимо учитывать две проблемы. Во-первых, компилятор, очевидно, должен знать, сколько памяти выделить во время компиляции. В приведенном выше примере это выглядит так, как будто бы все, что указывает decoder-> sync, имеет постоянный размер, поэтому это не должно быть проблемой. Однако если бы вы выделяли память для байтового массива для последовательности данных переменной длины, у вас возникла бы проблема. Вам придется либо выделить достаточно для максимально возможной длины данных, либо разбить данные на куски, или ... надеюсь, вы поняли идею.

Другая проблема - куча против стека. Все динамические выделения памяти происходят из кучи. Неглобальные статические выделения памяти происходят из стека, и стеки могут быть довольно маленькими во встроенных средах. Это означает, что если выделение памяти является средним-большим, вам, вероятно, потребуется сделать его глобальным или «статическим» (статические переменные локальной области видимости также выходят из кучи), чтобы избежать переполнения стека, даже если переменная не будет иначе должен быть глобальным.

Надеюсь, это имеет смысл.

...