Страницы

Поиск по вопросам

понедельник, 9 декабря 2019 г.

Выделение памяти на локальные и глобальные переменные

#cpp #c #микроконтроллеры #embedded


В программировании встраиваемых систем не рекомендуется использовать динамическое
выделение памяти. Отсюда у меня возник следующий вопрос. В случае глобальных переменных,
на сколько я знаю, память выделяется сразу. Что делать с локальными? Компилятор сразу
выделяет и на них память или возможна такая ситуация, что при вызове функции с локальными
переменными, память МК будет переполнена, что вызовет печальные последствия?
    


Ответы

Ответ 1



Компилятор не может "сразу" выделять память под локальные автоматические переменные, ибо при каждом рекурсивном входе в одну и ту же функцию она должна получать новый, независимый набор автоматических переменных. Это требует стекообразного динамического распределения памяти для локальных переменных во время выполнения. Что, разумеется, может приводить и к переполнению памяти во время выполнения. Если запретить рекурсивные вызовы в языке, то теоретически компилятор будет в состоянии предсказать максимальный вариант потребления памяти локальными переменными и даже выполнить "раннее" распределение памяти для таких переменных еще на этапе компиляции, фактически заменив их на глобальные переменные. Но что-то подобное можете сделать и вы сами, отказавшись от использования локальных переменных вообще. (Хотя даже в таком случае компилятору будет проще обеспечить максимальную экономию памяти путем "совместного использования" одних и тех же областей памяти теми локальными переменными, которые заведомо не могут существовать одновременно. Выполнить такую "упаковку" переменных вручную теоретически можно, но задача это тяжелая, трудноподдерживаемая и чреватая ошибками.)

Ответ 2



Да, это запросто - потому что локальные переменные выделяются в стеке, и его можно переполнить. Особенно при рекурсии или просто глубокой вложенности функций. Так что нужно или очень строго контролировать, что вызывается и как, и чего и сколько выделяется на стеке, или... С другой стороны, локальные переменные - если их немного - позволяют не заботиться о возможных неприятностях типа перекрытия имен и т.п. "По-моему, так" (с) Пух

Комментариев нет:

Отправить комментарий