Search
 
 
  Engleski
 
 
 
Open in this window (click to change)
Forum@DeGiorgi: Početna
Forum za podršku nastavi na PMF-MO
Login Registracija FAQ Smajlići Članstvo Pretražnik Forum@DeGiorgi: Početna

Inline funkcije + reference
WWW:

Moja sarma
 
Započnite novu temu   Odgovorite na temu   printer-friendly view    Forum@DeGiorgi: Početna -> Kolegiji diplomskih i starih studija -> Objektno programiranje (C++)
Prethodna tema :: Sljedeća tema  
Autor/ica Poruka
darioo
Forumaš(ica)
Forumaš(ica)


Pridružen/a: 06. 02. 2005. (14:26:16)
Postovi: (9)16
Sarma = la pohva - posuda
= 3 - 0

PostPostano: 14:34 ned, 15. 10. 2006    Naslov: Inline funkcije + reference Citirajte i odgovorite

Asistentu Novakoviću sam postavio par pitanja, na njih dobio korisne odgovore, te dijelim diskusiju sa svima...

Imamo 4 funkcije, rade istu stvar:

int f1(int a, int b) {return a+b;}
int f2(int &a, int &b) {return a+b;}
inline int f3(int a, int b) {return a+b;}
inline int f4(int &a, int &b) {return a+b;}

[quote="venovako"]OK, zamislimo da umjesto int-ova stoji neka grdosija.
Sve sto dolje kazes vrijedi za "dovoljno velike" strukture podataka.[/quote]

Očito je da je poziv f1 najsporiji, zbog pozivanja funkcije i stvaranja kopija a i b.

[quote="venovako"]Ocito.[/quote]

f2 bi trebao biti efikasniji jer baratamo sa stvarnim a i b zbog referenci, no i dalje se funkcija poziva

[quote="venovako"]Malo je smijesno govoriti o efikasnosti za slucaj int-ova. Jest da radimo sa stvarnim a i b, ali za int-ove je vjerojatnije da ce f2 biti sporiji, jer reference jesu pointeri koji se automatski dereferenciraju. Cim imas jedan nivo indirekcije, stvari rade brze samo ako su tipovi dovoljno veliki da je skuplje kopiranje od indirekcije.
Vec za kompleksne brojeve f2 bi vjerojatno radio brze od f1.[/quote]

Pročitah da bi std::cout << f3(a,b) << std::endl; C++ pročitao kao
std::cout << a+b << std::endl;, što zvuči razumno efikasno

[quote="venovako"]Tocnije, mogao bi procitati (ako je pametan i voljan), ali ne mora.[/quote]

Pitanje: da li su f3 i f4 jednako brzi, ili postoji ipak neka razlika?

f4 kao funkcija funkcionira, ali eto, nisam siguran kako ju C++ vidi ako se ponaša slično kao što sam opisao kod f3

[quote="venovako"]Ovo je dobro pitanje. Tocna semantika inline poziva.
Za to bih ipak trebao konzultirati standard.
Naime, ono sto te vjerojatno muci:
ako imamo
int c, d;
da li ce se
f3(c,d);
ekspandirati u (doslovno) c+d
ili ce se stvoriti privremeni objekti a i b, pokopirati u njih c i d, te onda ubaciti a+b
Ovako napamet bi mi se cinilo da semantika funkcije mora ostati identicna bilo da je kompajler odluci razmotati ili ne.
Naime, kompajler je posve slobodan jedan poziv f3 odmotati a drugi ostaviti kao stvarni funkcijski poziv.
Ocekivali bi da se u oba slucaja desavaju istovjetne stvari, inace ne bi bila u potpunosti definirana semantika funkcijskih poziva, sto si niti jedan jezik ne smije priustiti.
Naravno, ako je kompajler siguran da moze optimizirati stvari ne koristenjem kopiranja, a da se apsolutno nista time ne gubi (npr. eliminacija kopiranja vektora moze drasticno promijeniti smisao programa), vjerujem da bi zbilja i optimizirao.[/quote]
Asistentu Novakoviću sam postavio par pitanja, na njih dobio korisne odgovore, te dijelim diskusiju sa svima...

Imamo 4 funkcije, rade istu stvar:

int f1(int a, int b) {return a+b;}
int f2(int &a, int &b) {return a+b;}
inline int f3(int a, int b) {return a+b;}
inline int f4(int &a, int &b) {return a+b;}

venovako (napisa):
OK, zamislimo da umjesto int-ova stoji neka grdosija.
Sve sto dolje kazes vrijedi za "dovoljno velike" strukture podataka.


Očito je da je poziv f1 najsporiji, zbog pozivanja funkcije i stvaranja kopija a i b.

venovako (napisa):
Ocito.


f2 bi trebao biti efikasniji jer baratamo sa stvarnim a i b zbog referenci, no i dalje se funkcija poziva

venovako (napisa):
Malo je smijesno govoriti o efikasnosti za slucaj int-ova. Jest da radimo sa stvarnim a i b, ali za int-ove je vjerojatnije da ce f2 biti sporiji, jer reference jesu pointeri koji se automatski dereferenciraju. Cim imas jedan nivo indirekcije, stvari rade brze samo ako su tipovi dovoljno veliki da je skuplje kopiranje od indirekcije.
Vec za kompleksne brojeve f2 bi vjerojatno radio brze od f1.


Pročitah da bi std::cout << f3(a,b) << std::endl; C++ pročitao kao
std::cout << a+b << std::endl;, što zvuči razumno efikasno

venovako (napisa):
Tocnije, mogao bi procitati (ako je pametan i voljan), ali ne mora.


Pitanje: da li su f3 i f4 jednako brzi, ili postoji ipak neka razlika?

f4 kao funkcija funkcionira, ali eto, nisam siguran kako ju C++ vidi ako se ponaša slično kao što sam opisao kod f3

venovako (napisa):
Ovo je dobro pitanje. Tocna semantika inline poziva.
Za to bih ipak trebao konzultirati standard.
Naime, ono sto te vjerojatno muci:
ako imamo
int c, d;
da li ce se
f3(c,d);
ekspandirati u (doslovno) c+d
ili ce se stvoriti privremeni objekti a i b, pokopirati u njih c i d, te onda ubaciti a+b
Ovako napamet bi mi se cinilo da semantika funkcije mora ostati identicna bilo da je kompajler odluci razmotati ili ne.
Naime, kompajler je posve slobodan jedan poziv f3 odmotati a drugi ostaviti kao stvarni funkcijski poziv.
Ocekivali bi da se u oba slucaja desavaju istovjetne stvari, inace ne bi bila u potpunosti definirana semantika funkcijskih poziva, sto si niti jedan jezik ne smije priustiti.
Naravno, ako je kompajler siguran da moze optimizirati stvari ne koristenjem kopiranja, a da se apsolutno nista time ne gubi (npr. eliminacija kopiranja vektora moze drasticno promijeniti smisao programa), vjerujem da bi zbilja i optimizirao.




Zadnja promjena: darioo; 14:46 ned, 15. 10. 2006; ukupno mijenjano 1 put.
[Vrh]
Korisnički profil Pošaljite privatnu poruku
venovako
Forumaš(ica)
Forumaš(ica)


Pridružen/a: 07. 11. 2002. (22:46:38)
Postovi: (2F9)16
Sarma = la pohva - posuda
56 = 65 - 9

PostPostano: 14:45 ned, 15. 10. 2006    Naslov: Citirajte i odgovorite

Update:

nisam uspio pronaci nista u ISO draftu (mozda nisam dobro trazio).
Bjarne u TC++PLu pod sekcijom 7.1.1 veli: An [i]inline[/i] specifier does not affect the semantics of a function.

Kako je za primitivne tipove uglavnom svejedno kopira li ih se ili ne, a "debele" tipove u pravilu se salje po referenci, to odgovor na ovo pitanje ne bi trebao biti od presudnog znacaja.

Ako netko zna tocnu specifikaciju semantike inline poziva, bio bih mu zahvalan.
Update:

nisam uspio pronaci nista u ISO draftu (mozda nisam dobro trazio).
Bjarne u TC++PLu pod sekcijom 7.1.1 veli: An inline specifier does not affect the semantics of a function.

Kako je za primitivne tipove uglavnom svejedno kopira li ih se ili ne, a "debele" tipove u pravilu se salje po referenci, to odgovor na ovo pitanje ne bi trebao biti od presudnog znacaja.

Ako netko zna tocnu specifikaciju semantike inline poziva, bio bih mu zahvalan.


[Vrh]
Korisnički profil Pošaljite privatnu poruku
mesic
Forumaš(ica)
Forumaš(ica)


Pridružen/a: 01. 07. 2003. (20:16:56)
Postovi: (35)16
Spol: muško
Sarma = la pohva - posuda
= 8 - 2
Lokacija: /dev/(m)ucenje

PostPostano: 10:50 pon, 16. 10. 2006    Naslov: Citirajte i odgovorite

Neznam točnu semantiku, ali sam jednom pratio jednu opsežniju raspravu oko inline specifikacije. Otprilike, inline je više [i]hint[/i] prevodiocu, nego zapovjed (to smo znali), pa je naravno na samoj implementaciji da taj hint iskoristi povoljno.

Jedna tehnika je profiliranje kôda, tj. neka rudimentarnija verzija (ipak se radi o prevodiocu, ne pravom profiler-u), pa na osnovu omjera "moguća veličina"/"moguća brzina" prevodioc odlučuje što će napraviti.

Znam da M$ov prevodioc može uzeti datoteku nastalu profiliranjem kôda i na osnovu nje se onda odlučiti za [i]inline[/i] ili ne.

Treba još spomenuti i da će neke funkcije sam prevodioc 'ulinijati', ako zaključi da je to isplativije (barem M$ to radi, za ostale ne znam).

[/i]
Neznam točnu semantiku, ali sam jednom pratio jednu opsežniju raspravu oko inline specifikacije. Otprilike, inline je više hint prevodiocu, nego zapovjed (to smo znali), pa je naravno na samoj implementaciji da taj hint iskoristi povoljno.

Jedna tehnika je profiliranje kôda, tj. neka rudimentarnija verzija (ipak se radi o prevodiocu, ne pravom profiler-u), pa na osnovu omjera "moguća veličina"/"moguća brzina" prevodioc odlučuje što će napraviti.

Znam da M$ov prevodioc može uzeti datoteku nastalu profiliranjem kôda i na osnovu nje se onda odlučiti za inline ili ne.

Treba još spomenuti i da će neke funkcije sam prevodioc 'ulinijati', ako zaključi da je to isplativije (barem M$ to radi, za ostale ne znam).

[/i]


[Vrh]
Korisnički profil Pošaljite privatnu poruku Posjetite Web stranice
venovako
Forumaš(ica)
Forumaš(ica)


Pridružen/a: 07. 11. 2002. (22:46:38)
Postovi: (2F9)16
Sarma = la pohva - posuda
56 = 65 - 9

PostPostano: 13:09 pon, 16. 10. 2006    Naslov: Citirajte i odgovorite

Hvala na odgovoru!

Istina da profiliranje moze posluziti i za inline odluke.
Ono sto me muci je efektivni algoritam kad se kompajler vec odlucio da ce izvrsiti inline i je li on jedinstven medju svim kompajlerima.

Anybody?
Hvala na odgovoru!

Istina da profiliranje moze posluziti i za inline odluke.
Ono sto me muci je efektivni algoritam kad se kompajler vec odlucio da ce izvrsiti inline i je li on jedinstven medju svim kompajlerima.

Anybody?


[Vrh]
Korisnički profil Pošaljite privatnu poruku
HijenA
Forumaš(ica)
Forumaš(ica)


Pridružen/a: 23. 01. 2004. (16:46:04)
Postovi: (3D2)16
Spol: muško
Sarma = la pohva - posuda
-26 = 44 - 70
Lokacija: Prazan skup ;-)

PostPostano: 14:06 pon, 16. 10. 2006    Naslov: Citirajte i odgovorite

ovo mi se cini korisnim:

http://en.wikipedia.org/wiki/Inline_function

a ovo je definicija sa [url=http://www.mccabe.com/iq_research_iqgloss.htm]McCabe IQ Glossary Of Terms[/url]

[quote="[url=http://www.mccabe.com/iq_research_iqgloss.htm]McCabe IQ Glossary Of Terms[/url]"]
This is a directive used in C and C++ to indicate that a function ( module in McCabe IQ) should be expanded wherever it is used, rather than "called" as a separate piece of code. The inline directive is in fact just a request to do this, as there are rules used by the compiler to determine whether an inline function will in fact be expanded.[/quote]

HTH.

EDIT: ima nesto i [url=http://www.codersource.net/cpp_tutorial_inline_functions.html]ovdje[/url].
ovo mi se cini korisnim:

http://en.wikipedia.org/wiki/Inline_function

a ovo je definicija sa McCabe IQ Glossary Of Terms

McCabe IQ Glossary Of Terms (napisa):

This is a directive used in C and C++ to indicate that a function ( module in McCabe IQ) should be expanded wherever it is used, rather than "called" as a separate piece of code. The inline directive is in fact just a request to do this, as there are rules used by the compiler to determine whether an inline function will in fact be expanded.


HTH.

EDIT: ima nesto i ovdje.



_________________
Chuck Norris can divide by zero.

I bow before you Veliki Limun, on je kiseo i zut Bow to the left

[Vrh]
Korisnički profil Pošaljite privatnu poruku Pošaljite e-mail
venovako
Forumaš(ica)
Forumaš(ica)


Pridružen/a: 07. 11. 2002. (22:46:38)
Postovi: (2F9)16
Sarma = la pohva - posuda
56 = 65 - 9

PostPostano: 14:35 pon, 16. 10. 2006    Naslov: Citirajte i odgovorite

Hvala na linkovima, ali to nije ono sto trazim.

Trebam algoritam koji inline-ira C++ funkcije.
Nesto tipa "zamijenimo tijelo pozivom" je deskriptivno, ali ne i dovoljno dobro.
Hvala na linkovima, ali to nije ono sto trazim.

Trebam algoritam koji inline-ira C++ funkcije.
Nesto tipa "zamijenimo tijelo pozivom" je deskriptivno, ali ne i dovoljno dobro.


[Vrh]
Korisnički profil Pošaljite privatnu poruku
pecina
Forumaš(ica)
Forumaš(ica)


Pridružen/a: 19. 01. 2005. (14:15:23)
Postovi: (157)16
Spol: kućni ljubimac
Sarma = la pohva - posuda
62 = 85 - 23
Lokacija: Happily traveling through space since 1986!

PostPostano: 15:36 pon, 16. 10. 2006    Naslov: Citirajte i odgovorite

AFAIK, kompajler sam odlučuje što će inline-ati. MSVC nudi i __forceinline ali se kroz opcije može namjestiti da kompajler inline-a i one funkcije koje inače nećeš inline-ati eksplicitno.

Problem kod inline funkcija jest što podebljavaju sam kod i u biti mogu usporti program ako neki segment koda ne stane u cache page (koji je 4kb IIRC).

Što se tiče čistog algoritma, to je ovisno o implementaciji kompajlera, npr. gcc i msvc daju različite rezultate. Pogledaj assembler output za detalje. Stvarno je generalno teško dati općeniti kod jer inline-anje ovisi o kodu funkcije u kojoj inline-amo (zbog simboličkih imena i korištenja registara.
AFAIK, kompajler sam odlučuje što će inline-ati. MSVC nudi i __forceinline ali se kroz opcije može namjestiti da kompajler inline-a i one funkcije koje inače nećeš inline-ati eksplicitno.

Problem kod inline funkcija jest što podebljavaju sam kod i u biti mogu usporti program ako neki segment koda ne stane u cache page (koji je 4kb IIRC).

Što se tiče čistog algoritma, to je ovisno o implementaciji kompajlera, npr. gcc i msvc daju različite rezultate. Pogledaj assembler output za detalje. Stvarno je generalno teško dati općeniti kod jer inline-anje ovisi o kodu funkcije u kojoj inline-amo (zbog simboličkih imena i korištenja registara.



_________________
-- space available for rent --
[Vrh]
Korisnički profil Pošaljite privatnu poruku
venovako
Forumaš(ica)
Forumaš(ica)


Pridružen/a: 07. 11. 2002. (22:46:38)
Postovi: (2F9)16
Sarma = la pohva - posuda
56 = 65 - 9

PostPostano: 0:19 čet, 9. 11. 2006    Naslov: Citirajte i odgovorite

Ako nekoga interesira, poglavlje 4.5 u
"S. Lippman. Inside the C++ Object Model. AW, 1996"
bavi se (u grubim crtama) tehnikama inlineiranja C++ funkcija.
Detalje ne prenosim ovdje jer mi se ne da prevoditi a © se ne smije krsiti...
[size=4][color=grey]barem ako nismo na PM-u ;-][/color][/size]
Ako nekoga interesira, poglavlje 4.5 u
"S. Lippman. Inside the C++ Object Model. AW, 1996"
bavi se (u grubim crtama) tehnikama inlineiranja C++ funkcija.
Detalje ne prenosim ovdje jer mi se ne da prevoditi a © se ne smije krsiti...
barem ako nismo na PM-u ;-]


[Vrh]
Korisnički profil Pošaljite privatnu poruku
Prethodni postovi:   
Započnite novu temu   Odgovorite na temu   printer-friendly view    Forum@DeGiorgi: Početna -> Kolegiji diplomskih i starih studija -> Objektno programiranje (C++) Vremenska zona: GMT + 01:00.
Stranica 1 / 1.

 
Forum(o)Bir:  
Možete otvarati nove teme.
Možete odgovarati na postove.
Ne možete uređivati Vaše postove.
Ne možete izbrisati Vaše postove.
Ne možete glasovati u anketama.
You can attach files in this forum
You can download files in this forum


Powered by phpBB © 2001, 2002 phpBB Group
Theme created by Vjacheslav Trushkin
HR (Cro) by Ančica Sečan