Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: ++x vai x++

Sivun loppuun

Baglair [28.12.2005 22:29:11]

#

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++)   {
      ...
   }
}

Heikki [28.12.2005 22:38:20]

#

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.

Jaska [28.12.2005 22:44:35]

#

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ä.

rutkis [29.12.2005 09:22:31]

#

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.

sooda [29.12.2005 10:15:07]

#

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.

Deewiant [29.12.2005 11:20:26]

#

++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.

rutkis [29.12.2005 12:25:55]

#

Juuri tuota muistelin mitä deewiant kirjoitti.

Deewiant [29.12.2005 13:21:39]

#

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.

CyberianRat [29.12.2005 18:01:58]

#

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.

Deewiant [29.12.2005 18:21:51]

#

Kiitos - siinä hyvä syy, miksi kääntäjä todennäköisesti siis ei teekään tuota optimointia, ja kannattaa käyttää itse koodissa etuliiteoperaattoria.

Metabolix [29.12.2005 20:39:00]

#

Uskoisin, että sisään rakennetuilla tyypeillä tuo kyllä optimoidaan. Ainakin minulle heittää erroria, kun yritän tehdä oman ++-operaattorin int-tyypille.

Deewiant [29.12.2005 20:41:49]

#

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ää.


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta