[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