[elektro] C cimke milyen adattípusnak számít?
hg12345
hg12345 at freemail.hu
Thu Jan 24 18:17:01 CET 2008
Palasik Sandor <palasik at mail.datanet.hu> írta:
> > 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.
Mint eljarast mutattam....
>
> > 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.
>
Ebben nem érték egyett, eddig amit láttam mint forditási eredmény
bizony bizony nem nehéz jobbat generálni.
Sajnos a switch akármennyire is optimalizál sajnos nem modositja az
eljarásat, egy tömbbös elágazás valahogy igy néz ki asm-ben
and w0,#0x7,w0
sl w0,#1,w0
add #jumptablestart,w0
goto w0
jumptablestart:
goto A0
goto A1
....
goto A7
ha nagyon inteligens akarok lenni akkor az elsö sort helyettesítem a 2
sorral egy komparálássak és egy hibas index esetén való ugrassal.
Ennel gyorsabbat és rövidebbet nem hiszem hogy lehet irni. Raadasul
böven elfér nem felejtő memória területen, nem ugy mint a C esetén
ami hasonlo dolgokat csak reszletesen tamogat....
A dolog nem zavarna, de szeretném az IT részleteket is C-ben megirni,
és bizony teljesitményben van egy 2 osztó benne....
En ezt varnam egy optimalizalt forditotol, kivancsi vagyok letezik egy
ilyen.
> Palasik Sándor
>
> -----------------------------------------
> elektro[-flame|-etc]
>
Fotózz, töltsd fel képeid és oszd meg barátaiddal! - Fotóalbum.huhttp://ad.adverticum.net/b/cl,1,6022,242642,287334/click.prm
More information about the Elektro
mailing list