Mitä eroa on x++ ja ++x? Vaikkapa tässä esimerkissä.
int main(void) { int x; for(x = 0; x < 10; ++x) { ... } }
int main(void) { int x; for(x = 0; x < 10; x++) { ... } }
En nyt pääse testaamaan, mutta muistelisin eron olevan jotain tämäntapaista:
int foo=3; cout << foo++; // Tulostaa 3 cout << foo; // Tulostaa 4 foo=3; cout << ++foo; // Tulostaa 4 cout << foo; // Tulostaa 4;
Tuossa forrissa ei taida olla mitään eroa...
Mutta tämä mutuna.
Etuliiteoperaattori käsitellään ennen kuin muuttujaa voi käyttää mihinkään muuhun, jälkiliiteoperaattori käsitellään vasta kun muuttujaa käytetään kertaalleen. Minä pyrin välttämään noita operaattoreita aritmeettisissa laskutoimituksissa pitääkseni koodin siistimpänä.
Muistaakseni silmukoissa tuo ++x on nopeampi. :) Siitä generoituu muistaakseni yksi tai kaksi käskyä vähemmän eli käytännössä ei eroa huomaa ellei silmukka kierrä todella paljon.
For-silmukassa niistä tulee ihan samat ainaki mun gcc:llä. Ja aika pälli kääntäjä oliskin jos ei osais tommosessa tilanteessa optimoida siksi nopeammaksi vaihtoehdoksi.
++x on nopeampi vain jos x ei ole sisäänrakennettu tyyppi. Periaatteessahan se menee näin:
// x++ TYYPPI tmp; tmp = x; x += 1; return tmp; // ++x x += 1; return x;
Käytännössä generoitu koodi ei vastaa tuota täysin, esimerkiksi muistinkäytöltään, mutta lopputulos on sama.
Tämän takia esimerkiksi C++:ssa iteraattoreita suositellaan ynnättävän etu- eikä jälkiliitteellä - jälkiliite tekee turhan kopion, joka iteraattoreiden tapauksessa saattaa aiheuttaa huomattavankin eron.
Juuri tuota muistelin mitä deewiant kirjoitti.
Voisin lisätä sen, että fiksu kääntäjä optimoidessaan tajunnee ottaa tilalle ++x
:n jos x++
on käytössä eikä sen tulosta käytetä mihinkään - kuten for
-loopeissa.
Tahtoisin vielä lisätä lisäykseen, että kääntäjä ei aina saa tehdä tuota optimointia, voihan olla että ohjelmoija on pistänyt luokkansa x++-operaattorin tekemään jotain aivan muuta kuin mitä ++x-operaattori tekee.
Eli jos kyseessä on itse määritelty tyyppi ja operaattorien rungot eivät ole kääntäjällä näkyvissä, niin optimointi ei natsaa.
Kiitos - siinä hyvä syy, miksi kääntäjä todennäköisesti siis ei teekään tuota optimointia, ja kannattaa käyttää itse koodissa etuliiteoperaattoria.
Uskoisin, että sisään rakennetuilla tyypeillä tuo kyllä optimoidaan. Ainakin minulle heittää erroria, kun yritän tehdä oman ++-operaattorin int-tyypille.
Joo, tottakai. Puhuin ehkä epäselvästi: tarkoitin nimenomaan luokkia ja struktuureja. Sisäänrakennetut tyypit kuten int
eivät ole muokattavissa, joten niiden toiminta tiedetään etukäteen, joten kääntäjä optimoi niitä miten lystää.
Aihe on jo aika vanha, joten et voi enää vastata siihen.