www.mikrocontroller.net

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


Autor: Uff (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wo isn eigentlich der Unterschied?

Es wurde gesagt, dass ++quark schneller ist.

Autor: chrisigleich (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Nico Schümann (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
++quark braucht n paar Register weniger, ist daher schneller.

Autor: Christoph __ (chris)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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++.

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Markus K. (markus-)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.