Prethodna tema :: Sljedeća tema |
Autor/ica |
Poruka |
Gost
|
|
[Vrh] |
|
ahri Forumaš(ica)


Pridružen/a: 19. 11. 2003. (23:16:07) Postovi: (193)16
|
Postano: 0:06 pon, 24. 1. 2005 Naslov: |
|
|
umjesto da za nesto napises funkciju, napises makro.
i onda se na tom mjestu u kodu taj poziv zamjeni s onim sto pise u makru prije prevodjenja.
npr.
[code:1]
#define pluspet(x) ((x)+5)
...
y=pluspet(2);
...
[/code:1]
ovaj kod se ekspandira u:
[code:1]
...
y=(2)+5;
...
[/code:1]
a "bolje" je jer se ne poziva funkcija posebna za taj izracun... jer pozivanje funkcije trosi nesto procesorskog vremena. kada pozoves funkciju onda se u memoriji zapise gdje si bio u programu, onda se procesor prebaci na neki drugi dio memorije gdje je ta funkcija, proslijedi parametar, izracuna vrijednost funkcije, proslijedi ga putem stoga i vrati se gdje je bio.
na ovaj nacin se samo nastavi izvrsavati kod. to je isplativo kada se neka jednostavna funkcija vise puta izvodi.
no, makronaredbe mogu biti i pogubne, sporije!
npr:
[code:1]
#define max(a,b) (((a)>(b))?(a):(b))
...
y=max(2,3);
...
[/code:1]
ovdje je makro nesto slozeniji, i u ovom primjeru ima smisla koristiti ga.
no, u sljedecem:
[code:1]
#define max(a,b) (((a)>(b))?(a):(b))
...
y=max(mojagadnafunkcija(2),mojadrugagadnafunkcija(3));
...
[/code:1]
ce se ekspandirati u nesto posve divlje, gdje ce u svakom slucaju morati barem jednu od te dvije funkcije pozvati dvaput - prvi put kod uvjeta za max, drugi puta kada ce vracati vrijednost. u slucaju da je ta funkcija prilicno spora i mukotrpna, potrosili smo uludo duplo vremena, pa bi nam bilo bolje napraviti funkciju max koja ce primati argumente koji se prethodno izracunaju i vratiti veci od njih... tada ce se nasa velika funkcija samo jednom racunati sto je bolje.
sve u svemu, bolje je korstiti makro za neke jednostavnije racunice koje se vise puta pozivaju, a u svim ostalim slucajevima, just to be sure, koristiti funkcije.
nadam se da sam bio jasan, ako nesto nije jasno, pitaj.
umjesto da za nesto napises funkciju, napises makro.
i onda se na tom mjestu u kodu taj poziv zamjeni s onim sto pise u makru prije prevodjenja.
npr.
Kod: |
#define pluspet(x) ((x)+5)
...
y=pluspet(2);
...
|
ovaj kod se ekspandira u:
a "bolje" je jer se ne poziva funkcija posebna za taj izracun... jer pozivanje funkcije trosi nesto procesorskog vremena. kada pozoves funkciju onda se u memoriji zapise gdje si bio u programu, onda se procesor prebaci na neki drugi dio memorije gdje je ta funkcija, proslijedi parametar, izracuna vrijednost funkcije, proslijedi ga putem stoga i vrati se gdje je bio.
na ovaj nacin se samo nastavi izvrsavati kod. to je isplativo kada se neka jednostavna funkcija vise puta izvodi.
no, makronaredbe mogu biti i pogubne, sporije!
npr:
Kod: |
#define max(a,b) (((a)>(b))?(a):(b))
...
y=max(2,3);
...
|
ovdje je makro nesto slozeniji, i u ovom primjeru ima smisla koristiti ga.
no, u sljedecem:
Kod: |
#define max(a,b) (((a)>(b))?(a):(b))
...
y=max(mojagadnafunkcija(2),mojadrugagadnafunkcija(3));
...
|
ce se ekspandirati u nesto posve divlje, gdje ce u svakom slucaju morati barem jednu od te dvije funkcije pozvati dvaput - prvi put kod uvjeta za max, drugi puta kada ce vracati vrijednost. u slucaju da je ta funkcija prilicno spora i mukotrpna, potrosili smo uludo duplo vremena, pa bi nam bilo bolje napraviti funkciju max koja ce primati argumente koji se prethodno izracunaju i vratiti veci od njih... tada ce se nasa velika funkcija samo jednom racunati sto je bolje.
sve u svemu, bolje je korstiti makro za neke jednostavnije racunice koje se vise puta pozivaju, a u svim ostalim slucajevima, just to be sure, koristiti funkcije.
nadam se da sam bio jasan, ako nesto nije jasno, pitaj.
_________________ 
|
|
[Vrh] |
|
pecina Forumaš(ica)


Pridružen/a: 19. 01. 2005. (14:15:23) Postovi: (157)16
Spol: 
Lokacija: Happily traveling through space since 1986!
|
|
[Vrh] |
|
veky Forumaš(ica)

Pridružen/a: 09. 12. 2002. (19:59:43) Postovi: (5B0)16
Lokacija: negdje daleko...
|
|
[Vrh] |
|
mdoko Forumaš(ica)


Pridružen/a: 30. 11. 2002. (22:17:12) Postovi: (71A)16
Spol: 
Lokacija: Heriot-Watt University, Edinburgh
|
Postano: 19:36 pon, 24. 1. 2005 Naslov: |
|
|
Istina da se funkcije ne moraju nuzno inlineati, ali vecina danasnjih kompajlera prilicno pristojno inlinea funkcije, tako ako nesto ostavi kao poziv funkcije vjerojatno ima dobar razlog za to.
Valjda svi znaju za primjer:
[code:1]
#define min(a,b) (((a)<(b))?(a):(b))
[/code:1]
Nakon toga negdje u kodu:
[code:1]
min(a++, b++);
[/code:1]
Sto se ekspandira u:
[code:1]
(((a++)<(b++))?(a++):(b++));
[/code:1]
A to izaziva prilicno nezeljene efekte, jer se jedna od varijabli (a ili b) inkrementira dva puta, a to (u vecini slucajeva) nije bila namjera.
Zato je ipak bolje:
[code:1]
inline int min(int a, int b){
return a<b ? a : b;
}
[/code:1]
Sto je u C99 standardu dozvoljeno.
Ako se pise u C++u moze i jos ljepse:
[code:1]
template< typename T >
inline T min(const T& a, const T& b){
return a<b ? a : b;
}
[/code:1]
Istina da se funkcije ne moraju nuzno inlineati, ali vecina danasnjih kompajlera prilicno pristojno inlinea funkcije, tako ako nesto ostavi kao poziv funkcije vjerojatno ima dobar razlog za to.
Valjda svi znaju za primjer:
Kod: |
#define min(a,b) (((a)<(b))?(a):(b))
|
Nakon toga negdje u kodu:
Sto se ekspandira u:
Kod: |
(((a++)<(b++))?(a++):(b++));
|
A to izaziva prilicno nezeljene efekte, jer se jedna od varijabli (a ili b) inkrementira dva puta, a to (u vecini slucajeva) nije bila namjera.
Zato je ipak bolje:
Kod: |
inline int min(int a, int b){
return a<b ? a : b;
}
|
Sto je u C99 standardu dozvoljeno.
Ako se pise u C++u moze i jos ljepse:
Kod: |
template< typename T >
inline T min(const T& a, const T& b){
return a<b ? a : b;
}
|
_________________ Extraordinary claims require extraordinary evidence. – Carl Sagan
|
|
[Vrh] |
|
pecina Forumaš(ica)


Pridružen/a: 19. 01. 2005. (14:15:23) Postovi: (157)16
Spol: 
Lokacija: Happily traveling through space since 1986!
|
|
[Vrh] |
|
veky Forumaš(ica)

Pridružen/a: 09. 12. 2002. (19:59:43) Postovi: (5B0)16
Lokacija: negdje daleko...
|
|
[Vrh] |
|
Gost
|
|
[Vrh] |
|
|