C++ singleton pre MCU

Sekcia: Programovanie 26.02.2011 | 02:29
Avatar Grawp   Používateľ
Potrebujem singleton-y na zapúzdrenie (vytvorenie rozhrania) UARTu a iných hw. záležitostí. Aké je z hladiska CPU najefektívnejšie riešenie?
Existuje nejaké efektívnejšie riešenie než toto: ? class Single {
public:
static Single *instance() {
return &inst;
}
private:
static Single inst;
Single(const Single&) {};
Single & operator=(const Single&) {};
~Single() {};
};

Single Single::inst;

Ako dobre dokáže gcc optimalizovať volanie typu Single::instance()->funkcia(); ? Vytvorí sa kód, ktorý kdesi uloží získaný pointer a následne sa skočí na miesto, na ktoré pointer ukazuje? Alebo vytvorí kód ktorý skočí rovno na tú funkciu, bez toho aby jej adresu zbytočne ukladal na stack?
    • Re: C++ singleton pre MCU 26.02.2011 | 03:15
      darth vader   Návštevník
      S trochou stastia kompilator spravi z tej funkcie instance inline funkciu a priamo pouzije pointer. Mozno sa to da odsledovat nejakym valgrindom.

      Ale osobne nechapem pointu hladania optimalizacie pri volani instance, kedze dokopy cas spraveny pri tom by mal byt zanedbatelny voci inym veciam...
      A navyse kombinovat dobre objektovo napisany kod a optimalizacie na drobnosti je totalne uchylne.
      Bud chces citatelny kod a strpis drobne neefektivnosti alebo chces prudko efektivny kod a potom ho nepises objektovo.
      • Re: C++ singleton pre MCU 26.02.2011 | 10:57
        Avatar Grawp   Používateľ
        Pozeral som ako toto majú ošetrené v arduine. Robia to tak, že všetky premenné a funkcie daných triedy sú static. Prípadné viaceré inštancie potom nezaberajú v pamati žiadne miesto. Takže už mám riešenie.

        Pre tých, čo mi chcú napísať niečo o čiste objektovo orientovanom programovaní, odkazujem, že to v žiadnom prípade na MCU nepatrí. Mne ide len o vytvorenie common rozhrania. Napr. objekt reprezentujúci I2C a UART budú mať sčasti rovnaký interface (napr. sendchar(), flushBuffer() ....). Btw. používam objekty aj bežným sposobom, ale to neznamená napr. že v nich nepoužijem inline asm. Čisté obj. programovanie na MCUs nepatrí a navyše C++ je schválne navrhnutý ako multiparadigm jazyk.