Продолжу задавать вопросы по плюсам в этой теме. Предыстория та-же.
Написал класс клавиатуры MtxKeyboard со статическими переменными и функциями. Не забыл добавить в него виртуальные функции, которые будут и у наследников. Наследники такие:
Код
template<int row, int col>
class MtxButton : public MtxKeyboard
{
public:
/*virtual /*inline*/ uint8_t Get() { return State[(col-1)]&(1<<(row-1));}
/*virtual /*inline */ uint8_t Pressed() { return (Get()&&(Ticks>=KEYPRES_TRESHOLD))? 1 : 0;}
/*virtual /*inline */ uint8_t Locked() { return (Get()&&(Ticks>=KEYLOCK_TRESHOLD))? 1 : 0;}
};
Простенькая тестовая прога:
Код
MtxButton<1,1> Key_Num1;
MtxButton<1,2> Key_Num2;
MtxButton<1,3> Key_Num3;
MtxButton<1,4> Key_Num4;
//========== еще 16 кнопок
class Client_c
{public:
Client_c(MtxKeyboard * pB):pButton(pB){};
MtxKeyboard * pButton;};
Client_c Client_1(&Key_Num1);
Client_c Client_2(&Key_Num2);
Client_c * pClient[]={&Client_1,&Client_2};
int main(void){
for(;;) {
Keys.Scan();
if (Key_Num1.Pressed())pin1.Toggle();
if (Client_1.pButton->Pressed())pin2.Toggle(); }
return 0;}
на максимальной оптимизации в WinAVR130309 компилится в 500+ байт кода и около 10байт ОЗУ. Но вот как только я делаю функции наследников виртуальными - таже прога компилится в 3000+ байт кода и 230байт ОЗУ. Я в курсе про таблицу вызова виртуальных процедур, но 2 тыщи слов она не сожрет. В чем проблема? По сгенеренному асму не могу понять.. Какбудто оптимизация отключается. На всякий случай приложил исходники.