Re: GNU C kérdés..
Andras Tantos
andras at tantosonline.com
Tue Jul 10 22:39:32 CEST 2007
Hali!
He-he, koszi a bizalmat :-).
A fordito nem 'optimalizalja' a valtozok kiosztasat a memoriaban, mar csak
azert sem, mert nem tud rola. A linker dolga ennek az eldontese. A linker
speciel optimalizalhat, de legtobbszor nem teszi: olyan sorrendben rakja az
'dolgokat' a kulonbozo section-okbe, ahogy megtalalja oket. Ez legtobbszor
azt a sorrendet jelenti, ahogy a parancssorban megadtad oket, de persze,
mint mindig, vannak kivetelek:
- A konyvtarakat (akar az LD is, ha megkered ra) rekurzivan keresi, es az
egyes object fajlokat csak akkor rakja bele az eredmenybe, ha van benne
olyan szimbolum, ami felold egy meg nem feloldott hivatkozast. Ez foleg
akkor igaz, amikor a linker a tranzitiv lezarasat keresi a szimbolumoknak
(pl. link.exe)
- A fentit meg lehet kavarni a 'KEEP' attributummal a linker script-ben, LD
eseten
- Ha LD eseten be van kapcsolva a 'szemet-gyujtes', illetve link.exe-nel az
optimalizacio, akkor a linker ossze-olvaszthat azonos blokkokat (tipikus
eset amikor inline fuggvenyek tobb .obj-ben is vannak de a fordito ugy
dontott, hogy meg se legyenek ezek inline-ok. Masik tipikus eset a kulonbozo
template fuggveny instance-ek).
- A legtobb linker optimalizalja a csak olvashato adatszegmens tartalmat
(string-konstansok), es az azonos tartalmu string-eket egy helyre pakolja -
ez a fenti egy specialis alkalmazasa egyebkent.
- A linker kavarhat az alignment-tel is, azaz nem kotelezo szamara az egymas
utan kovetkezo elemenet a memoriaban folytonosan lerakni. Legtobbszor nem is
teszi, hanem az adott CPU szohosszara igazit. Pl. ARM-nal nem is tehet mast,
mert a CPU nem tamogat un-aligned cimzest.
Vannak aztan olyan programok, amik a kesz binaris fajlt gyurjak tovabb, hogy
a program meg gyorsabban fusson. No, ezek azok akik igazan szet kapjak a
fajlt es mas sorrendben rakjak ossze ujra, bar azt hiszem ezek is zommel a
kodot kavarjak. Nem tudom mas cegek mit csinalnak, az MS-nel pl. ezek vannak
hasznalatban: http://www.microsoft.com/windows/cse/bit_projects.mspx. Eleg
goromba eszkozok amugy, erdemes kicsit megnezni oket, akit erdekel.
Osszefoglalva nem jo olyan programot irni, amelyik erre epit.
A struktura az mar jobb megoldas, de igy persze egy fajlban kell mindent
megadni. Ekkor a nyelv garantalja a sorrendet, de nem az allokaciot, azaz az
allignment meg mindig bekavarhat.
En speciel azon a velemenyen vagyok, hogy ha ilyen dolgokat csinalsz, akkor
igyis-ugyis fuggesz az adott platform linkeretol, akkor meg mar jobb, ha a
fuggoseg jol dokumentalt es explicit, mint sem implicit a forraskodban,
raadasul jol elrejtve tipuskonverziok moge, hogy meg veletlenul se legyen
belole forditasi/linkelesi hiba. Dehat, mint annyi minden mas, ez is izles
dolga.
Udv,
Tantos Andras
----- Original Message -----
From: "Fuzesi Arnold" <arnold.fuzesi.lista at gmail.com>
To: <elektro at tesla.hu>
Sent: Tuesday, July 10, 2007 11:02 AM
Subject: Re: GNU C kérdés..
Biztos vagy ebben?
Mondjuk valóban célszerű egy file-ban deklarálni ilyenkor az összes adott
section-ben levő változót.....
Tapasztalatom ugyan korlátos, de még az életben nem futottam abba bele, hogy
az optimalizáció megkavarta volna a változó sorrendet.
Pedig elég sokat csibészkedek hasonló dolgokkal.
De András majd megmondja a tutit, mire számíthat az ember ilyenkor.
Vagy rakd strukturába őket és kész...
Azon belül csak nem kavar már....
Vagy union(struktura, tömb[sectionmerete]) és a tömb kezdőcíme a section
eleje.
A.
----- Original Message -----
From: "hg12345" <hg12345 at freemail.hu>
To: <elektro at tesla.hu>
Sent: Tuesday, July 10, 2007 7:47 PM
Subject: Re: GNU C kérdés..
Bocs..., de ha forditó optimalizá,l akkor már nem tudod melyik az első
konstans vagy változó az adott section-ban, ha kiveszed az
optimalizáció alol, és a linker más sorrendben hivja meg objekteket,
már megint más lehet az első változó a területen.
Fuzesi Arnold <arnold.fuzesi.lista at gmail.com> írta:
> Az ugyan az...az első változó kezdőcíme, mint a section címe.
> Legalább is semmi okot nem látok rá, hogy ne így legyen.
> (Esetleg Align nyűgök, de sztem abból gond itt nem lesz)
>
> Persze lehet keresgélni a linker script-ben, de az ahány fordító annyi
féle.
>
> "(A definició változhat forditonként...)"
> megjegyzésből meg arra következtettem vmi univerzális megoldás
kell.
>
> Amit írtam az afele hajlik.
>
> Ha pl a stack eleje vége kellene, akkor lenne érdemes mélyebben
belenyúlni.
> Azt nem találja meg az ember ilyen egyszerűen, és hordozható
módon.
>
> A.
> ----- Original Message -----
> From: "Moczik Gabor" <pm at progzmaster.hu>
> To: <elektro at tesla.hu>
> Sent: Tuesday, July 10, 2007 6:44 PM
> Subject: Re: GNU C kérdés..
>
>
> Fuzesi Arnold wrote:
> > void* address; (mondjuk void, de lehet __generic uchar*
is....forditotol
> > nagyban fugg...)
> >
> > address=&Str1[0]
> > vagy address=Str1
>
> Ezzel a valtozo cime megvan, de neki nem ez kell ha jol ertem,
hanem annak a
> blokknak a kezdocime, ahol a fordito elkezdi tarolni az oda rendelt
> valtozokat...
>
> --
> ((( Móczik Gábor )))--((( pm -> @ -> progzmaster -> . -> hu )))
> ((( Skype: moczik )))
>
> -----------------------------------------
> elektro[-flame|-etc]
>
> -----------------------------------------
> elektro[-flame|-etc]
>
Melyik testrészeden szabadulnál végleg a szőrtől? Az Aesthetica-ban most
akár 50% kedvezményt is kaphatsz egyes területek lézeres kezelésére! Klikk
ide a részletekért!
http://www.webdesign.hu/aesthetica/flash_microsite/?id=12;p_code=3005
-----------------------------------------
elektro[-flame|-etc]
-----------------------------------------
elektro[-flame|-etc]
More information about the Elektro
mailing list