Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Potraga za optimizacijom

[es] :: C/C++ programiranje :: Potraga za optimizacijom

[ Pregleda: 2183 | Odgovora: 8 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

NrmMyth
Ivan Maček
Split

Član broj: 63456
Poruke: 849
*.cmu.carnet.hr.

Sajt: www.dump.hr


Profil

icon Potraga za optimizacijom09.08.2006. u 07:12 - pre 215 meseci
Znte li koji kompajleri vrse ovu optimizaciju
Code:
string func( int i ) {...};

int main( void )
{
    string str;
    str = func( 13 );
    return 0;
}

u
Code:
void func( int i, string& __ret ) {...};

int main( void )
{
    string str;
    func( 13, str );
    return 0;
}


Hvala.
 
Odgovor na temu

NastyBoy
Bojan Nastic
UK

Član broj: 12041
Poruke: 895
*.plus.com.



+4 Profil

icon Re: Potraga za optimizacijom09.08.2006. u 09:11 - pre 215 meseci
To je "named return value optimization" - eliminacija copy konstruktora i destruktora za temporary objekte. VC++ 2005 implementira tu optimizaciju:

http://msdn.microsoft.com/libr...-us/dnvs05/html/nrvo_cpp05.asp
 
Odgovor na temu

tosa
上海, 中国

Član broj: 1811
Poruke: 1342
*.ubisoft.com.cn.

ICQ: 14293955
Sajt: https://github.com/milost..


+48 Profil

icon Re: Potraga za optimizacijom09.08.2006. u 09:18 - pre 215 meseci
To što tebi treba je RVO (return value optimization), koju podržava MSVC a verovatno još
kompajlera, čini mi se i GCC. Problem je što ta optimizacija neće uvek raditi, evo primera:
Code:

Vector getVec( float X, float Y, float Z )
{
    Vector ret(X,Y,Z);
    return ret;
}

U ovom slučaju, kompajler neće uraditi ništa, dok će u sledećem potpuno eleminisati copy-constructor:
Code:

Vector getVec( float X, float Y, float Z )
{
    return Vector(X,Y,Z);
}

 
Odgovor na temu

Dragi Tata
Malo ispod Kanade

Član broj: 1958
Poruke: 3906
*.lionbridge.com.



+6 Profil

icon Re: Potraga za optimizacijom09.08.2006. u 12:19 - pre 215 meseci
Pisao sam nešto malo o tome svojevremeno:

http://www.novetehnologije.com/Default.aspx?tabid=87
 
Odgovor na temu

kiklop74
Darko Miletić
Buenos Aires

Član broj: 78422
Poruke: 569
*.iplannetworks.net.

Sajt: ar.linkedin.com/pub/darko..


+13 Profil

icon Re: Potraga za optimizacijom09.08.2006. u 12:55 - pre 215 meseci
Sta kaze o tome Stann Lippman:

"The Name Return Value Optimization"
http://blogs.msdn.com/slippman/archive/2004/02/03/66739.aspx


Tko leti vrijedi
 
Odgovor na temu

NrmMyth
Ivan Maček
Split

Član broj: 63456
Poruke: 849
*.cmu.carnet.hr.

Sajt: www.dump.hr


Profil

icon Re: Potraga za optimizacijom09.08.2006. u 23:52 - pre 215 meseci
Vidim da tu postoje problemi.
Dali postoje smjernice kako konstruirati kod tako da se sigurno moze kazati da je NRVO uspjeo.
 
Odgovor na temu

kiklop74
Darko Miletić
Buenos Aires

Član broj: 78422
Poruke: 569
*.iplannetworks.net.

Sajt: ar.linkedin.com/pub/darko..


+13 Profil

icon Re: Potraga za optimizacijom10.08.2006. u 12:51 - pre 215 meseci
Koliko ja znam ne postoji. Jedini nacin da se to sazna je analiza asemblerskog koda po kompajliranju ili uraditi nesto slicno kao u textu S. Lippmana.

Kad god mozes bolje koristi Return Value Optimization. To provereno radi.

Na primer:

Code:

#include <iostream>
#include <tchar.h>

struct nrvo_test {
    nrvo_test():someValue(0) {
        std::cout << "Default CTOR" << std::endl;
    }
    nrvo_test(int value) : someValue(value) {
        std::cout << "Standard CTOR" << std::endl;
    }
    nrvo_test(const nrvo_test &rhs) : someValue(rhs.someValue){
        std::cout << "Copy CTOR" << std::endl;
    }
    ~nrvo_test() {
        std::cout << "DTOR" << std::endl;
    }
    int GetValue() { return someValue; }
private:
    int someValue;
};

nrvo_test RVO(int value) {
    return nrvo_test(value); //ovako se pomaze kompajleru da uradi rvo optimizaciju
}                                    //dakle povratna vrednost se generise uz pomoc konstruktora
                                      //u povratnom delu funkcije

nrvo_test NRVO(int value) {
    nrvo_test val(value);
    return val;
}

int _tmain(int argc, _TCHAR* argv[])
{
    std::cout << RVO(10).GetValue() << std::endl;
    nrvo_test t = nrvo(20);
    std::cout << t.GetValue() << std::endl;
    return 0;
}


Videces kad iskompajliras ovaj program koliko puta je pozvan konstruktor i destruktor i po tome mozes da zakljucis da li je optimizacija izvrsena ili ne.


[Ovu poruku je menjao kiklop74 dana 10.08.2006. u 14:02 GMT+1]
Tko leti vrijedi
 
Odgovor na temu

NrmMyth
Ivan Maček
Split

Član broj: 63456
Poruke: 849
*.cmu.carnet.hr.

Sajt: www.dump.hr


Profil

icon Re: Potraga za optimizacijom10.08.2006. u 19:43 - pre 215 meseci
Code:
nrvo_test RVO(int value) {
    return nrvo_test(value); //ovako se pomaze kompajleru da uradi rvo optimizaciju
}
Znaci ovo bi trebalo uvijek raditi.
 
Odgovor na temu

kiklop74
Darko Miletić
Buenos Aires

Član broj: 78422
Poruke: 569
*.iplannetworks.net.

Sajt: ar.linkedin.com/pub/darko..


+13 Profil

icon Re: Potraga za optimizacijom10.08.2006. u 20:38 - pre 215 meseci
Citat:
NrmMyth:
Code:
nrvo_test RVO(int value) {
    return nrvo_test(value); //ovako se pomaze kompajleru da uradi rvo optimizaciju
}
Znaci ovo bi trebalo uvijek raditi.


Nema definitivnog odgovora na to pitanje. U vecini slucajeva verovatno da. Kao i sve drugo u programiranju sve zavisi od okolnosti kao i od tipa kompajlera, opcija za optimizaciju itd.


Tko leti vrijedi
 
Odgovor na temu

[es] :: C/C++ programiranje :: Potraga za optimizacijom

[ Pregleda: 2183 | Odgovora: 8 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.