Еще один способ отъема денег у …

… бедных программистов с помощью компилятора.

Маленькая программка на С.

Внутри код

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%)

Хорошие, добрые и отзывчивые люди!

2 thoughts to “Еще один способ отъема денег у …”

  1. Всё правильно он днлать. Надо мат.часть тщательнее изучать. 🙂

  2. Всё правильно он днлать. Надо мат.часть тщательнее изучать. 🙂

Comments are closed.