Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

26.06.2006, 16:25

++i > i++ ?

mir liegt mal wieder eine performance frage auf dem herzen :>

ein prof. meiner FH behauptet in seinem skript nämlich folgendes, ich zitiere:
"In C++ wird allgemein das Pre-Inkrement bevorzugt. Er ist bei komplizierten Ausdrücken - die in C nicht möglich sind - wesentlich effizienter und auch leichter zu implementieren."

stimmt das? falls ja, wieso benutzen dann alle i++?

danke schonmal :>

koschka

Community-Fossil

Beiträge: 2 862

Wohnort: Dresden

Beruf: Student

  • Private Nachricht senden

2

26.06.2006, 16:32

Ich würde sagen das ist schlichtweg falsch.

Ob du nun erst i inkrementierst und dann den Rest der Formel ausrechnest oder andersrum ist doch wurst. Auch vom logischen her ist i++ meiner meinung nach verständlicher u.a. auch weil man in C/C++ nun mal bei 0 mit dem zählen anfängt und nicht bei 1, dadurch würdest du wenn du ++i benutzt schnell in Probleme kommen, weil du wenn du die 0 brauchst immer logischerweise von -1 anfangen musst, dadurch brauchst du unter Umständen mehr Platz (da signed) und das nur wegen einem Wert?

Prof's erzählen schon mal öfters Mist, ist mir auch schon aufgefallen ob das nun absicht ist oder pure Unwissenheit ist sicher fraglich.

ext

Treue Seele

  • Private Nachricht senden

3

26.06.2006, 17:13

Er hat recht, denn in C kann man Pre- und Postinkrement nur auf built-in Typen anwenden und somit kann der C-Compiler jederzeit ein Postinkrement bei dem der alte Wert gar nicht gewollt ist, sondern der neue Wert einfach entsprechend ändern.
In C++ haben wir die hübsche Operatorüberladung, plötzlich kann man in einem Pre- und in einem Postinkrement tun was man will, somit kann der Compiler für benutzerdefinierte Typen (lies: klassen) nicht mehr diese Optimierung vornehmen, da er nicht wissen kann ob beide das gleiche tun.

Somit sollte man ein Preinkrement verwenden, wenn man die Variable um 1 erhöhen will und ein Postinkrement verwenden, wenn man den Wert der Variablen möchte und anschließend um 1 erhöhen möchte.

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

4

26.06.2006, 17:19

Und wieder fällt ein Sack Reis in China um. Mal ehrlich, da ist es doch entscheidender wie man das Programm strukturiert. Wahrscheinlich ist das auch noch ein Spässchen, wo jeder Kompilier was anderes mit macht(von wegen optimieren).
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

ext

Treue Seele

  • Private Nachricht senden

5

26.06.2006, 17:27

Zitat von »"Nox"«

Und wieder fällt ein Sack Reis in China um. Mal ehrlich, da ist es doch entscheidender wie man das Programm strukturiert. Wahrscheinlich ist das auch noch ein Spässchen, wo jeder Kompilier was anderes mit macht(von wegen optimieren).

Schade, dass er mir nicht auf den Kopf fällt, würde die Kopfschmerzen nach dem Lesen deines Postings vielleicht betäuben..

Anonymous

unregistriert

6

26.06.2006, 17:35

Ein Prof hat ausnahmsweise absolut recht!

rklaffehn

Treue Seele

Beiträge: 267

Wohnort: Braunschweig

  • Private Nachricht senden

7

26.06.2006, 17:42

Mal ein kleines Beispiel, wie sowas in der Implementation aussehen kann. (aber Pseudocode, und kann sein, dass ich die Operatoren vertauscht habe, also, "kids, don't do this at home..." :p )

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
Integer& Integer::operator ++ () // pre-increment

{
  return *this += 1;
}

Integer Integer::operator ++ (int) // post-increment

{
  Integer res = *this;
  *this += 1;
  return res;
}

Man sieht also, beim Post-Increment muss man den Wert einmal kopieren, wobei beim Pre-Increment gleich die Werteänderung stattfindet.

Wenn man sowas also zigtausendmal innerhalb seiner innersten Programmschleife macht, kann das schon teuer sein. Auf eine Compiler-Optimierung würde ich niemals zählen (auch wenn der auf Micro-Ebene bisher immer besser optimiert hat, als ich ;) )

Gruss,
Rainer
God is real... unless declared integer.
http://www.boincstats.com/signature/user_967277_banner.gif

8

26.06.2006, 22:44

kann man dann nicht einfach machen:

C-/C++-Quelltext

1
2
3
4
5
Integer Integer::operator ++ (int) // post-increment

{
   *this += 1;
  return (*this - 1);
}


aber falls das wirklich so sein sollte stellt sich mir die frage warum man das postinkrement viel häufiger antrifft als das präinkrement. okay das macht vielleicht in den meisten fällen keinen unterschied aber man kann sich doch angewöhnen das effizientere zu benutzen so oft es geht :)

koschka

Community-Fossil

Beiträge: 2 862

Wohnort: Dresden

Beruf: Student

  • Private Nachricht senden

9

26.06.2006, 22:55

Meiner Meinung ist sowas echt wurst. Wenn man optimiert sollte man zuerst an die Schleifen ran und nicht bei so nem Kleinkram anfangen. Ja ok es ist schneller, da die CPU ja erst i inkrementieren und gleich in dem Register lassen kann für die Berechnung. Aber bei dem CPU Takt und bei 2 echten Kernen ist sowas doch nun echt schnuppe - und nur was für theoretiker ;).

Ich persöhnlich würde mich auch an der zählweise stören, den meist setzt man das Increment ja nur für irgendwelche Zählvariablen ein.

10

26.06.2006, 23:27

Hmm... ich benutz normal halt ++i odg ;) Ich vermute mal das es daran liegt das die meisten den Unterschied einfach nicht kennen!

Was ich meistens nen bissel dümmer finde ist BOOL anstelle von bool zu nutzen... man sehe sich einmal die define von BOOL an... int ...
Devil Entertainment :: Your education is our inspiration
Der Spieleprogrammierer :: Community Magazin
Merlin - A Legend awakes :: You are a dedicated C++ (DirectX) programmer and you have ability to work in a team? Contact us!
Siedler II.5 RttR :: The old settlers-style is comming back!

Also known as (D)Evil

Werbeanzeige