Forum: Compiler & IDEs ++quark oder quark++ ?


von Uff (Gast)


Lesenswert?

Wo isn eigentlich der Unterschied?

Es wurde gesagt, dass ++quark schneller ist.

von chrisigleich (Gast)


Lesenswert?

Hallo,

der generelle Unterschied ist ++quark ist der PRÄinkrement Operator und

quark++ der POSTinkrement Operator d.h. beim präinkrement wird die
variable ERST erhöht und dann gelesen, beim postinkrement operator wird
die variable erst gelesen und dann erhöht.

Beispiel:

quark = 5;

x = ++quark;
nach der Anweisung:
x = 6 und quark =6
/*
entspricht
quark=quark+1;
x=quark;
*/

quark =5;

 x = quark++;
/*
entspricht
x=quark;
quark=quark+1;

*/

nach der Anweisung:

x = 5 und quark =6

Hoffe dir ist damit geholfen.

mfg
chrisigleich

von Nico Schümann (Gast)


Lesenswert?

++quark braucht n paar Register weniger, ist daher schneller.

von Christoph _. (chris)


Lesenswert?

> ++quark braucht n paar Register weniger, ist daher schneller.
In C? Bei einem optimierenden Compiler? Nein, das wäre mir neu.

In C++ dagegen kann dank Operatorüberladung ++i tatsächlich um
Größenordnungen schneller sein als i++, wenn man in beiden Fällen den
Rückgabewert nicht beachtet.

Daher sollte man sich in C++ z.B. auch angewöhnen, den dritten
Parameter einer üblichen for-schleife als ++i zu schreiben; wobei ++i
bei einer for-schleife selbstverständlich auch in C semantisch viel
sinnvoller als i++ ist, aber das nur nebenbei.

von Rolf Magnus (Gast)


Lesenswert?

> In C++ dagegen kann dank Operatorüberladung ++i tatsächlich um
> Größenordnungen schneller sein als i++, wenn man in beiden Fällen
> den Rückgabewert nicht beachtet.

Es kann im Prinzip auch um Größenordnungen langsamer sein. Hängt halt
ganz davon ab, wie die beiden definiert werden und ob inlining
vorgenommen wird. Meistens ist der Unterschied gering bis nicht
vorhanden. In der Regel wird in C++ der Präfix-Operator bevorzugt, wenn
man den Rückgabewert nicht nutzt, weil er für Klassen üblicherweise
nicht langsamer, manchmal aber einen Tick schneller als der andere ist.
Da man in C den Operator nicht überladen kann, ist die Wahl hier
ziemlich egal. Es wird wohl meistens der Postinkrement-Operator
verwendet, wobei ich hier keinen Grund kenne.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

> Es wird wohl meistens der Postinkrement-Operator
> verwendet, wobei ich hier keinen Grund kenne.

Dürfte historische Gründe haben.  Wenn p ein Zeiger ist, dann konnte
die PDP-11 die Ausdrücke *p++ und *--p direkt in der Maschine als
Adressierungsart abbilden (*).  Das dürfte auch der Grund gewesen
sein, warum K&R diese Operatoren überhaupt in C aufgenommen haben,
wobei sie natürlich die jeweils entgegengesetzten aus Symmetriegründen
auch mit aufgenommen haben.

(*) Die PDP-11 hatte überhaupt die saubersten Addressierungen aller
Maschinen, die ich bislang gesehen habe.  Der PC war r7, sodass das
Lesen der Opcodes auch nur eine Variante von *p++ ist, der
Stackpointer r6, ein PUSH entsprechend *--p, ein POP *p++.

von Rolf Magnus (Gast)


Lesenswert?

> Dürfte historische Gründe haben.  Wenn p ein Zeiger ist, dann
> konnte die PDP-11 die Ausdrücke *p++ und *--p direkt in der
> Maschine als Adressierungsart abbilden (*).

Das kann der AVR auch ;-)

> Das dürfte auch der Grund gewesen sein, warum K&R diese Operatoren
> überhaupt in C aufgenommen haben, wobei sie natürlich die jeweils
> entgegengesetzten aus Symmetriegründen auch mit aufgenommen haben.

Allerdings scheint mir auch x-- verbreiteter als --x.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

> Das kann der AVR auch ;-)

Na klar.  Als der Operator erfunden wurde, konnten Compiler
aber noch nicht so viel optimieren wie heute.  Daher ja
auch das register-Schlüsselwort, das ein Hinweis an den
Compiler war.  Genauso war eben die Verwendung von *p++
ein Hinweis, heute ist es egal, ob man stattdessen *p und
p++ separat schreibt.

Eine PDP-11 war speichermäßig (je nach Ausbau) sowas wie wir
als ATmega128 mit 64 KB RAM vielleicht heute besitzen, nur
eben eine Größenordnung (oder mehr?) langsamer. ;-)

> Allerdings scheint mir auch x-- verbreiteter als --x.

Bei reiner Arithmetik ist es ja auch egal, der Vorteil des
Addressierungsmodes kommt ja nur bei *--p zum Tragen.

von Markus K. (markus-)


Lesenswert?

"Es wird wohl meistens der Postinkrement-Operator
verwendet, wobei ich hier keinen Grund kenne."

Ich denke das liegt daran:
x = x + 1;
ist das gleiche wie
x += 1;
ist (mehr oder weniger) das gleiche wie:
x++;

Es ist einfach die logische Vereinfachung.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.