… бедных программистов с помощью компилятора.
Маленькая программка на С.
Внутри код
uint8_t i[]="123456789012345678901234567890";
Или +30 байт.
Результат:
Program space used F9h ( 249) of 2000h words ( 3.0%)
Data space used 49h ( 73) of 200h bytes ( 14.3%)
А теперь добавим const перед i, показывая компилятору, что неплохо бы переменную перенести в “программную” часть.
Program space used D9h ( 217) of 2000h words ( 2.6%)
Data space used Bh ( 11) of 200h bytes ( 2.1%)
Хм. 249-217=32 байт освободили в программной части и 73-11=62 (!) байта в области данных
Говоря другими словами, родной компилятор XC8, если не сказать другого, при любом использовании переменной хранит 2 копии переменной в программной памяти и 2 копии в области данных. Сказать, что я офигел мрачно, значит ничего не сказать.
После этого становится понятно, откуда компилятор берет ресурсы для оптимизации и гордо сообщает при любом удобном случае Running this compiler in PRO mode, with Omniscient Code Generation enabled, produces code which is typically 40% smaller than in Free mode.
(Чуть позже) решил перепроверить, а то вдруг всякие библиотеки/типа навязались
Сделал пустой проект с одним файлом для PIC16F1503.
void main(void) {
char i[30]="123456789012345678901234567890";
int q;
q=i[2];
}
Ничего больше, ни инклюдов, ни библиотек, ни инициализаций.
Program space used 4Ah ( 74) of 800h words ( 3.6%)
Data space used 42h ( 66) of 80h bytes ( 51.6%)
добавляем const
Program space used 2Fh ( 47) of 800h words ( 2.3%)
Data space used 6h ( 6) of 80h bytes ( 4.7%)
Хорошие, добрые и отзывчивые люди!