Anzeige:
Ergebnis 1 bis 12 von 12

Thema: wann postinkrementieren?

  1. #1
    Registrierter Benutzer
    Registriert seit
    28.05.2003
    Beiträge
    161

    wann postinkrementieren?

    Einfuehrende Buecher scheinen zu dem Thema post vs. preincrement bzw. decrement nicht viel zu sagen zu haben. Jetzt habe ich gelesen, dass pre-inkrementieren schneller geht. Macht ja auch Sinn, wenn man mal drueber nachdenkt.
    Wann also kann man ohne Effizienzeinbusse postinkrementieren benutzen?

    Danke,

    Samsara
    Interface design
    whohas - wer hat's im Repository? Debian? Fedora? Gentoo? ...?
    Hardware compatibility list - das Original mit bereits 3000 Einträgen
    It ain't a hack if it ain't dirty.

  2. #2
    Registrierter Benutzer Avatar von peschmae
    Registriert seit
    14.03.2002
    Ort
    Schweizland
    Beiträge
    4.549
    Ich hab auch schon darüber nachgedacht. Wieso macht das Sinn?

    Ich benutz aber eigentlich immer Post-increment - schliesslich sieht i++ einfach besser aus als ++i. Ausnahme natürlich da, wos drauf an kommt - aber das ist ja nur selten der Fall.

    MfG Peschmä
    The greatest trick the Devil ever pulled was convincing the world he didn't exist. -- The Usual Suspects (1995)
    Hey, I feel their pain. It's irritating as hell when people act like they have rights. The great old one (2006)

  3. #3
    Registrierter Benutzer
    Registriert seit
    24.06.2003
    Beiträge
    486

    Re: wann postinkrementieren?

    Original geschrieben von samsara
    Jetzt habe ich gelesen, dass pre-inkrementieren schneller geht.
    Das kommt drauf an.

    Wann also kann man ohne Effizienzeinbusse postinkrementieren benutzen?
    Wenn es sich im einen eingebauten Datentyp handelt,oder um einen Pointer darauf,und der Ausdruck keine Seiteneffekte hat,dann ist es egal,ob Post- oder Preincrement.Es wird vom Compiler in äquivalenten Code umgesetzt.
    Bsp
    Code:
    for(int i = 0;i < 10;i++) 
    {....
    oder 
    i++;
    ++i;
    In den Beipielen ist es egal.

    Wichtig ist es bei komplexen Datentypen,zb. Iteratoren,weil hier muß ein vielleicht komplexes Objekt erzeugt werden beim Postincrement.
    Problem hierbei ist,daß der Compiler nicht sagen kann,dann mach ich ebend die Preincrement-Variante,wegen Seiteneffekten.
    Bsp
    Code:
    class KomplexeKlasse {
    ...
        KomplexeKlasse& operator++() {  //Preincrement
             //incrementieren und zurückgeben
        }
    
        KomplexeKlasse operator++(int) {  //Postincrement
             //Temporäres Objekt erzeugen,this erhöhen,3.Weltkrieg auslösen,Temp zurückgeben
        }

  4. #4
    Registrierter Benutzer Avatar von SeeksTheMoon
    Registriert seit
    22.02.2002
    Beiträge
    762
    es geht darum:
    Beim Post Incr wird der Wert erst ausgelesen und dann erhöht, beim Pre Incr wird er direkt erhöht.

    Allerdings bezweifle ich, dass man dies in irgendeinem Programm bemerkt, außer man schreibt vielleicht einen Atombombensimulator...
    I haven't lost my mind - It's somewhere on a backup-disc

  5. #5
    Registrierter Benutzer
    Registriert seit
    28.05.2003
    Beiträge
    161
    Wenn ich mir mal anmasse, die bisherigen Antworten zusammenzufassen:

    Postinkrement ist immer langsamer, aber in der grossen Mehrzahl der Faelle ist dieser Unterschied zu vernachlaessigen.

    Was ich in naeherer Zukunft vorhabe, ist an Komplexitaet dem Atombombensimulator aehnlich, also schon gut, vorher zu wissen, wie man ein paar Tage Rechenzeit sparen kann

    Dank an alle,

    Samsara
    Interface design
    whohas - wer hat's im Repository? Debian? Fedora? Gentoo? ...?
    Hardware compatibility list - das Original mit bereits 3000 Einträgen
    It ain't a hack if it ain't dirty.

  6. #6
    Registrierter Benutzer
    Registriert seit
    24.06.2003
    Beiträge
    486
    Original geschrieben von samsara
    Wenn ich mir mal anmasse, die bisherigen Antworten zusammenzufassen:

    Postinkrement ist immer langsamer, aber in der grossen Mehrzahl der Faelle ist dieser Unterschied zu vernachlaessigen.
    Das war nicht die Lehre,die du daraus ziehen solltest .

    Nochmal kurz,nur für C (ohne ++),da brauch' ich nicht auf komplexe Datentypen eingehen (siehe oben):
    Diese Anweisungen erzeugen alle 100% identischen Code (Optimierungen eingeschaltet)
    Code:
    //i sei ein int
    ++i;
    i++;
    i += 1;
    i = i + 1;
    Warum?Weil der Kontext so ist,daß man von außen keinen Unterschied feststellen kann.
    Alle Seiteneffekte müßen beim ; abgeschlossen sein.

    Post und Preincrement erlangen erst im zusammenhängenden Kontext ihre Bedeutung,wie in diesen Beispielen:
    Code:
    array[++i] = a;
    a = ++i;
    Hier hast du keine Wahl zwischen Post- und Preincrement,du willst das Verhalten von Preincrement (bzw. Postinc.),ansonsten wäre das Ergebniss ein völlig anderes.
    Hier läßt sich also kein Unterschied in der Performance feststellen,denn die Semantik ist eine völlig andere (Äpfel-Birnen-Vergleich).

    Moral von der Geschichte:
    Benutze Postincrement,wenn du Postincrement brauchst.
    Benutze Preincrement,wenn du Preincrement brauchst.
    Ansonsten wirst du eh keinen Unterschied feststellen.

  7. #7
    Registrierter Benutzer
    Registriert seit
    28.05.2003
    Beiträge
    161
    Original geschrieben von wraith
    Code:
    array[++i] = a;
    a = ++i;
    Hier hast du keine Wahl zwischen Post- und Preincrement,du willst das Verhalten von Preincrement (bzw. Postinc.),ansonsten wäre das Ergebniss ein völlig anderes.
    Hier läßt sich also kein Unterschied in der Performance feststellen,denn die Semantik ist eine völlig andere (Äpfel-Birnen-Vergleich).
    Okay, die Beispiele oben sind natuerlich voellig aus dem Kontext gegriffen. Wenn man den Kontext entsprechend umgestaltet, kommt man wieder vor die Entscheidung:
    Code:
    for (array_index = 0; array_index <= length_of_array;) {
       array[i++] = a;
    }
    oder
    Code:
    for (array_index = -1; array_index < length_of_array;) {
       array[++i] = a;
    }
    Darf ich Deine Erklaerung so verstehen, dass die beiden obenstehenden Implementierungen auch gleich schnell laufen wuerden?

    Danke,

    Samsara
    Interface design
    whohas - wer hat's im Repository? Debian? Fedora? Gentoo? ...?
    Hardware compatibility list - das Original mit bereits 3000 Einträgen
    It ain't a hack if it ain't dirty.

  8. #8
    Registrierter Benutzer
    Registriert seit
    24.06.2003
    Beiträge
    486
    Original geschrieben von samsara
    Wenn man den Kontext entsprechend umgestaltet, kommt man wieder vor die Entscheidung:
    Code:
    for (array_index = 0; array_index <= length_of_array;) {
       array[i++] = a;
    }
    oder
    Code:
    for (array_index = -1; array_index < length_of_array;) {
       array[++i] = a;
    }
    Darf ich Deine Erklaerung so verstehen, dass die beiden obenstehenden Implementierungen auch gleich schnell laufen wuerden?
    Das ist so ein Grenzfall ,würde ich mir mal den ASM Output vom generierten Code anschauen.
    Eigentlich erwarte ich das mein Compiler daraus optimalen Code erstellt,ohne das ein Tempory von i erzeugt wird.
    IMO wird daraus sowas erzeugt
    Code:
    for (array_index = 0; array_index <= length_of_array;) {
       array[i] = a;
        ++i;
    }

  9. #9
    Registrierter Benutzer
    Registriert seit
    01.08.2001
    Beiträge
    57
    @ samsara:

    Darf man fragen, was du vorhast?
    Oder muß ich dann erschossen werden?

  10. #10
    Registrierter Benutzer Avatar von peschmae
    Registriert seit
    14.03.2002
    Ort
    Schweizland
    Beiträge
    4.549
    Muss er denn was vorhaben?

    Ich denke er kann auch so Fragen stellen

    MfG Peschmä
    The greatest trick the Devil ever pulled was convincing the world he didn't exist. -- The Usual Suspects (1995)
    Hey, I feel their pain. It's irritating as hell when people act like they have rights. The great old one (2006)

  11. #11
    Registrierter Benutzer
    Registriert seit
    01.08.2001
    Beiträge
    57
    Er sagte weiter oben:
    Was ich in naeherer Zukunft vorhabe, ist an Komplexitaet dem Atombombensimulator aehnlich, also schon gut, vorher zu wissen, wie man ein paar Tage Rechenzeit sparen kann
    Da bin ich neugierig geworden...

    Aber man muß natürlich nichts vorhaben, um Fragen zu stellen. Fragen aus reinem Interesse sind oft die besten...

    MfG

  12. #12
    Registrierter Benutzer Avatar von peschmae
    Registriert seit
    14.03.2002
    Ort
    Schweizland
    Beiträge
    4.549
    stimmt, das war mir gar nicht aufgefallen

    MfG Peschmä
    The greatest trick the Devil ever pulled was convincing the world he didn't exist. -- The Usual Suspects (1995)
    Hey, I feel their pain. It's irritating as hell when people act like they have rights. The great old one (2006)

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •