[elektro] C cimke milyen adattípusnak számít?

Palasik Sandor palasik at mail.datanet.hu
Thu Jan 24 17:39:08 CET 2008


> Nincs igazad, van másik :-()
>
> létezik a követekző megoldás:
>
> Jump Tables via Function Pointer Arrays
>
> amit a SWITCH helyett ajánlanak, mert sokkal gyorsabb :-)
>
>
> kb:
>
> void (*pf[])(void) = {fna, fnb, fnc, 
, fnz};
>
> használata
>
>       *pF[index]();

Ok, ez van, bár ennek semmi köze a címkékhez. Gyorsabbnak meg azért
gyorsabb, mert a switch-nél nem tudod megkerülni az értékhatár-ellenőrzést,
de ettől eltekintve általában ugyanerre fordul. Ha azt is beleszámolod az
időbe, akkor a switch gyorsabb, mert kimaradnak a függvényhívások.

> GCC leiras 5.3  "Label as Value"
>
> ugyan az mint fent némi különbséggel
>
> Absolute
> static void *array[] = { &&foo, &&bar, &&hack };
> goto *array[index];
>
> Relativ
> static int* array[]  {&&foo-&&foo, &&bar-&&foo, &&back-&&foo);
>
> goto *(&&foo + array[index]) ;
>
> A két alkalmazás közötti különbség csak annyi, hogy elvileg az
> első "const" is definiálható, addig a második csak "static"-nt,
> mert a
> linker nem tud két pointerrel müveletet végezni, ezt csak init
> időben
> tudja a C megcsinalni.

Ez meg GCC. Van abban még egy-két kreatív trükk, de ettől még sem a C-ben,
sem a  C++ban nincs && operátor egy operandussal.

Szóval fenntartom, amit írtam. Valószínűleg ezért is nem működik az
MPLABC30-ban.

Ez a foo, bar, hack meg így is kinézhetne:

switch(index) {
case 0: goto foo;
case 1: goto bar;
case 2: goto hack;
    }

Egy normális fordító rájön, hogy két jump van egymás után és a switch-hez
fordított címketáblába már eleve a célcímkéket teszi. Lefordítva ugyanolyan
gyors lesz. De ennyi erővel lehetne a kódokat rögtön a case címkék után
írni.

Palasik Sándor



More information about the Elektro mailing list