On Wed, 18 Apr 2012 07:17:40 -0700 (PDT), Ermin Hasicevic
<
ermin.h...@gmail.com> wrote:
>> Daklem, nemoj eksportirat metode klase, vec definiraj baznu klasu i sve
>> cemu pristupas proglasi virtualnim. U tom slucaju sve prebacujes na
>> kompajler, a ne linker.
>>
>
>Tnx, stvar radi odlicno! :) No i dalje ne znam sto znaci da ovim sve
>prebacujem na
>compiler?! Zanima me objasnjenje tog fenomena pa ako ti se da
>objasnit, možeš
>li opisati to u nekoliko kratkih crta ili dati neki link?
Eh, ne znam koliko cu uspjeti suvislo objasniti, no, pokusat cu...
Dakle, u originalnom slucaju, tvoj .lib fajl interno sadrzi tablicu svojih
eksportiranih funkcija gdje povezuje ime funkcije sa adresom gdje se ona u
libu nalazi.
U exeu to koristis tako da napravis extern <potpis funkcije> cime dajes do
znanja kompajleru kakva je funkcija i da je definirana negdje drugdje. Kad
dodje do linkanja, linker ce sve to posloziti; konkretno, tu funkciju nece
pronaci u exeu, pa ce ici po libovima, pronaci ime u tablici i tamo ce
saznati adresu s kojom treba poziv funkcije povezati.
To sto konkretno imas member funkciju, a ne globalnu, uopce nije bitno -
vrijede identicna pravila.
U 'mom' slucaju, sa virtualnim funkcijama, library ne eksportira nista,
vec samo priredi objekt sa tocno propisanim layoutom (tocno se zna kako
treba posloziti u memoriji member varijable, te vtable - tablicu sa
pointerima na virtualne funkcije).
Na strani exe-a kompajler isparsira include fajl i time dozna layout
klase. S obzirom da to zna, kad mu prebacis pointer na klasu i pozoves
funkciju, on zna doci do vtablea, zna na kojem se offsetu nalazi pozvana
funkcija i automatski moze procitati na koju adresu treba skociti. U
teoriji radi se o jednom koraku vise, ali, sve se odvije bez pomoci
linkera i bez potrebe da moduli izmjenjuju imena funkcija.
P.S. Za ispravne termine koje treba guglat ce vec netko drugi pomoci.
Mozda static i dynamic/virtual binding? Npr, na testu za trenutno posao
nisam znao odgovoriti sto je to enkapsulacija, a nije da je ne trosim
svaki dan. ;)