|
делать тогда и только тогда когда Вы используете рекурсивный вызов функций. Но при этом придется к локальным переменным обращаться не "напрямую", а через косвенную адресацию, что вызовет резкое увеличение кода программы и времени ее выполнения. Для 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