Wo isn eigentlich der Unterschied? Es wurde gesagt, dass ++quark schneller ist.
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
> ++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.
> 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.
> 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++.
> 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.
> 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.
"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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.