2017-03-20 1 views
3

Angenommen, wir haben eine Methode. Innerhalb der Methode befindet sich eine Schleife mit n Iterationen, in der ein Objekt myObj deklariert und initialisiert wird.Werden in Schleifen deklarierte Objekte nur einmal erstellt?

  • Wie oft ist es konstruiert und zerstört? Einmal oder n mal?
  • Wann passiert die Konstruktion - wenn die Linie ausgeführt wird, oder wenn das Programm die Methode aufruft?
  • Wann passiert die Zerstörung? Am Ende jeder Iteration, bei das Ende des for-Block, oder das Ende der Methode?

Beispiel:

void foo() 
{ 
    for (int i = 0; i < 100; i++) 
    { 
     A myObj(); 
    } 
} 
+3

Interessanterweise konstruiert und zerstört der Code Ein Objekt [* zero * mal] (https://en.wikipedia.org/wiki/Most_vexing_parse) – ikh

Antwort

5

Wie oft ist es aufgebaut und zerstört? Einmal oder n mal?

n-mal.

Wann passiert die Konstruktion - wenn die Linie ausgeführt wird oder wenn das Programm die Methode aufruft?

Wenn die Zeile ausgeführt wird.

Wann passiert die Zerstörung? Am Ende jeder Iteration, am Ende des for-Blocks oder am Ende der Methode?

Wenn aus dem Bereich des Objekts herauskommen; für Ihren Beispielcode am Ende jeder Iteration.


BTW: A myObj(); ist keine Definition des Objekts, sondern eine Erklärung der Funktion. Sie könnten meinen A myObj; oder A myObj{}; (seit C++ 11). Suchen Sie nach most vexing parse für weitere Details.

+1

Ja, du hast recht, A myObj {} ist was ich meinte. –

2

100 verschiedene Objekte werden konstruiert und zerstört.

Nachdem gesagt, dass, wenn die Konstruktion und die Zerstörung des Objekts trivial ist, Sie keinen Leistungsaufwand sehen werden.

Weiter, wenn ein optimierender Compiler feststellen kann, dass die Konstruktionen und Zerstörungen keine beobachtbare Auswirkung auf das Ergebnis haben, ist es frei, redundanten Code zu entfernen.

Als Faustregel empfiehlt es sich jedoch, Objekte nur dann in Schleifen zu erstellen, wenn Sie das Aufbau- und Zerstörungsverhalten benötigen.

3

In Ihrem Code myObj ist erklärt aber nie definiert. myObj wird als eine Funktion deklariert, die keine Argumente annimmt und ein Objekt vom Typ A zurückgibt.

Eine Deklaration, die keine Definition ist, hat keinen Laufzeiteffekt, daher gibt es bei jeder Iteration der Schleife keine Konstruktion.

Hätten Sie ein Objekt innerhalb des Schleifenkörpers deklariert und definiert, dann würde es am Definitionspunkt konstruiert und am Ende seines Bereichs (das Ende des Schleifenkörpers) bei jeder Iteration zerstört.

Verwandte Themen