Каковы некоторые рекомендации по сокращению использования памяти в C? - PullRequest
38 голосов
/ 01 января 2009

Каковы некоторые рекомендации для "Memory Efficient C программирования". Главным образом для встроенных / мобильных устройств, каковы должны быть рекомендации для низкого потребления памяти?

Я полагаю, должно быть отдельное руководство для а) памяти кода б) памяти данных

Ответы [ 15 ]

2 голосов
/ 07 сентября 2009
  • Уменьшите длину и исключите как можно больше строковых констант, чтобы уменьшить пространство кода

  • Тщательно рассмотрите соотношение алгоритмов и таблиц поиска, где это необходимо

  • Помните о том, как распределяются различные виды переменных.

    • Константы, вероятно, находятся в пространстве кода.
    • Статические переменные, вероятно, находятся в фиксированных ячейках памяти. Избегайте их, если это возможно.
    • Параметры, вероятно, хранятся в стеке или в регистрах.
    • Локальные переменные также могут быть выделены из стека. Не объявляйте большие локальные массивы или строки, если в худшем случае в коде может не хватить места в стеке.
    • У вас может не быть кучи - может не быть операционной системы, которая будет управлять кучей за вас. Это приемлемо? Вам нужна функция malloc ()?
1 голос
/ 07 сентября 2009

В дополнение к предложениям других, помните, что локальные переменные, объявленные в ваших функциях, обычно размещаются в стеке.

Если память стека ограничена или вы хотите уменьшить размер стека, чтобы освободить место для кучи или глобальной оперативной памяти, рассмотрите следующее:

  1. Выровняйте дерево вызовов , чтобы уменьшить количество переменных в стеке в любой момент времени.
  2. Преобразование больших локальных переменных в глобальные переменные (уменьшает объем используемого стека, но увеличивает объем используемой глобальной оперативной памяти). Переменные могут быть объявлены:

    • Глобальная область действия: отображается для всей программы
    • Статика в области видимости файла: отображается в том же файле
    • Статика в области действия функции: Видна в функции
    • ПРИМЕЧАНИЕ: Независимо от того, если эти изменения были внесены, вы должны опасаться проблем с кодом reentrant, если у вас есть среда preemptive .

Многие встроенные системы не имеют диагностики стекового монитора, чтобы гарантировать, что переполнение стека обнаружено, поэтому требуется некоторый анализ.

PS: Бонус за правильное использование Переполнение стека ?

1 голос
/ 09 января 2009

У меня есть презентация конференции по встраиваемым системам, доступная по этой теме. Это с 2001 года, но все же это очень применимо. Смотри бумага .

Также, если вы можете выбрать архитектуру целевого устройства, выбирая что-то вроде современного ARM с Thumb V2, PowerPC с VLE или MIPS с MIPS16, или выбирая известные компактные цели, такие как Infineon TriCore или SH семья это очень хороший вариант. Не говоря уже о семействе NEC V850E, которое приятно компактно. Или перейдите на AVR, который имеет отличную компактность кода (но это 8-битный компьютер). Хороший выбор - все, кроме 32-разрядного RISC фиксированной длины!

0 голосов
/ 02 января 2009

Отличным способом ограничения требований к памяти является максимально возможное использование libc или других стандартных библиотек, которые могут быть динамически связаны. Каждая дополнительная DLL или общий объект, который вы должны включить в свой проект, представляет собой значительный объем памяти, который вы можете избежать при записи.

Кроме того, используйте объединения и битовые поля, где это применимо, загружайте только часть данных, над которыми работает ваша программа, в память и убедитесь, что вы компилируете с параметром -Os (в gcc; или аналогом вашего компилятора). ), чтобы оптимизировать размер программы.

0 голосов
/ 01 января 2009

Один прием, который полезен в приложениях, - это создание фонда памяти в дождливый день. Выделите один блок при запуске, который достаточно велик, чтобы его хватило для задач очистки. Если malloc / new потерпит неудачу, освободите фонд дождливого дня и опубликуйте сообщение, информирующее пользователя о том, что ресурсы ограничены, и они должны сэкономить и довольно скоро. Этот метод использовался во многих приложениях Mac примерно в 1990 году.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...