Ist Pre- und Post-Inkrement / Dekrement-Operatoren in C ++ gleiche Leistung in einer Schleife hat? [Duplikat]

StackOverflow https://stackoverflow.com/questions/631506

  •  08-07-2019
  •  | 
  •  

Frage

Betrachten wir folgende zwei Beispiele.

class ClassOne
{
 //class definition is here
};

std::vector< ClassOne > myListOfObjects;

std::vector< ClassOne >::const_iterator iter = myListOfObjects.begin();

Example 1: 
for( ; iter < myListOfObjects.end(); **++iter**)
{
   //some operations
}

OR

Example 2: 
for( ; iter < myListOfObjects.end(); **iter++**)
{
   //some operations
}

Welches ist schneller? ++ iter oder iter ++ im Zusammenhang mit der Schleife.

Reason Fro Verschluss:

Kopiert von Brians Post (auf die Frage prägnanter zu machen).

Sie können auch einer dieser ähnlichen Fragen versuchen: hier oder hier oder hier oder hier .

War es hilfreich?

Lösung

Wie bereits erwähnt in diese Antwort , pre ist schneller. Sie sind nur die gleichen, wenn Sie mit Primitive handelt (int, char, etc.). In diesem Fall rufen sie überladene Operatoren.

Andere Tipps

Nein, sie haben nicht die gleiche Leistung:

  • Postinkrement wird erstellen eine Kopie dann erhöhen, dann die Kopie zurückgeben
  • Vorinkrement wird die ursprünglich
  • erhöht dann zurück

So (es sei denn, Sie Umgang mit einfachen Dingen wie Ints) Vorinkrement schneller ist.

Es hängt davon ab. In einem naiven Compiler wird Vorinkrement schneller sein. In Pseudo-Code, hier ist was jeder von ihnen tut:

preincrement() {
  val = val + 1;
  return val;
}

postincrement() {
 tmp = val; // take a temporary copy of the old value
 val = val + 1;
 return tmp;
}

In der Praxis wird der Compiler oft schalten Sie einen postincrmeent in Vorinkrement, wenn es mit ihm weg zu bekommen. Aber für komplexe Typen, kann es nicht in der Lage sein, das zu tun. Als allgemeine Regel gilt, verwendet Vorinkrement, wann immer möglich, und nur postincrmenet verwenden, wenn Sie die spezifische Semantik dieser Operation benötigen.

Wenn mit nicht primitiven Typen zu tun. ++ iter wird immer effizienter sein,

Der Grund ++ iter effizienter ist, kommt es auf die Arbeit jeder tun muss, ihren Rückgabewert zu erhalten. Ob der Rückgabewert tatsächlich verwendet wird oder nicht, spielt keine Rolle.

Der Unterschied:

  • ++ iter gibt ein Verweis auf sich selbst , so gibt es keine temporäre Kopie benötigt. (Schrittweite, Rückkehr Bezug auf eigenen Wert)

  • iter ++ gibt eine temporäre Kopie der Variable

    (Temp var mit altem Wert, erhöht, Rücklauftemp var erstellen)
    _Myt _Tmp = *this;
    ++*this;
    return (_Tmp);
    

Sie können auch einer dieser ähnlichen Fragen versuchen: hier oder hier oder hier oder hier . Sie sind nicht genau das gleiche, obwohl, wie sie gelten nicht für Iteratoren.

Ich bin fast sicher, sie auf die gleiche Sache in Maschinencode zu reduzieren, nur in einer anderen Reihenfolge. Ich würde sagen, dass sie die gleichen sind, aber ich würde empfehlen Ihnen einen schnellen Test-App schreiben zu überprüfen.

Pre-Zuwachs ist im Allgemeinen besser, sofern Sie nicht einen besonderen Bedarf für Nachinkrement haben.

Dies ist jedoch ein Compiler bestimmte Sache. Die meisten modernen Compiler weniger ops für eine Präfixnotation erstellen. Mit Klassenmethode Überlastungen, bedeutet dies nicht immer optimiert bekommen, obwohl, da es hängt davon ab, wie die Klasse implementiert wird.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top