[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&#337; megoldás:
> >
> > Jump Tables via Function Pointer Arrays
> >
> > amit a SWITCH helyett ajánlanak, mert sokkal gyorsabb :-)
> >
> >
> > kb:
> >
> > void (*pf[])(void) = {fna, fnb, fnc, &#133;, 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&#337;rzést,
> de ett&#337;l eltekintve általában ugyanerre fordul. Ha azt is 
beleszámolod az
> id&#337;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&#337; "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&#337;ben
> > tudja a C megcsinalni.
> 
> Ez meg GCC. Van abban még egy-két kreatív trükk, de ett&#337;l még sem 
a C-ben,
> sem a  C++ban nincs && operátor egy operandussal.
> 
> Szóval fenntartom, amit írtam. Valószín&#369;leg ezért is nem m&#369;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&#337;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&#337; 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