Такие вещи (динамическое выделение стека) имеет смысл (+)
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено Беня 20 августа 2003 г. 15:00
В ответ на: Профессионалы по KEILу 51! Как сделать так, чтобы компилятор при входе в функцию размещал локальные переменные в стеке, а при выходе - освобождал память? отправлено KAN 20 августа 2003 г. 11:36

делать тогда и только тогда когда Вы используете рекурсивный вызов функций. Но при этом придется к локальным переменным обращаться не "напрямую", а через косвенную адресацию, что вызовет резкое увеличение кода программы и времени ее выполнения. Для MSP-430, AVR реализовано динамическое выделение локальных переменных, но у них совсем другая архитектура (у них нет выигрыша при использовании статических локальных переменных).
Причем (ЭТО ВАЖНО) Вы же не получите НИКАКОГО выигрыша при использовании динамических локальных переменных! Ваши рассуждения к примеру о функции с 64-мя байтами локальных переменных неверны! Эти 64 байта не теряются - они будут использованы для локальных переменных в другой функции. Например :
void fun1( void) {
unsigned char array2[ 40] ;
...
}

void fun2( void) {
unsigned char array2[ 60] ;
...
}

void fun3( void) {
unsigned char array3[ 550] ;
...
}

void main( void) {
fun1() ;
fun2() ;
fun3() ;
}
Всего будет использовано 60 байт под локальные переменные - array1[], array2[] и array3[] будут перекрываться. Так что после выхода из функции область памяти не пропадает - она используется под локальные переменные при вызове других функций.
ТАК ЧТО ПРИ ИСПОЛЬЗОВАНИИ ДИНАМИЧЕСКОГО ВЫДЕЛЕНИЯ ЛОКАЛЬНЫХ ПЕРЕМЕННЫХ ВЫИГРЫША НЕ БУДЕТ - ПОДУМАЙТЕ САМИ ПОЧЕМУ. А ЕСЛИ ОЗУ УЖЕ НЕ ХВАТАЕТ, ТО ПРИ ИСПОЛЬЗОВАНИИ ДИНАМИЧЕСКОГО ВЫДЕЛЕНИЯ ВАША ПРОГРАММА ПРОСТО ЗАТРЕТ КАКУЮ-ТО ЧУЖУЮ ОБЛАСТЬ ОЗУ И ПОДВИСНЕТ - ЭТО ОЧЕНЬ КОВАРНАЯ ОШИБКА.

Составить ответ  |||  Конференция  |||  Архив

Ответы



Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru