Kann i = v.end () aus einer for-Schleife heraus optimiert werden?

8

Ich habe gerade so etwas gesehen:

%Vor%

ist es besser, dies zu tun:

%Vor%

Ich denke, ich dachte mir, dass der Optimierer sich darum kümmern würde. Liege ich falsch?

    
Adrian 20.09.2013, 02:10
quelle

3 Antworten

7

Ja, die zweite Version kann optimaler sein, solange Ihr Container niemals modifiziert wird aber kann der Compiler nicht sagen, dass der Container nie modifiziert wurde.

Die "optimalste" Schleifenstruktur kann gefunden werden, indem die C ++ 11-basierte for -Schleife untersucht wird.

Der Code:

%Vor%

wird grob in:

übersetzt %Vor%

wobei eine Variable, die mit __ beginnt, nur zu Darstellungszwecken existiert und die using std::begin; using std::end; wird aus der Betrachtung innerhalb von // body entfernt. (Beachten Sie, dass jede Variable, die __ enthält, für die Compilerimplementierung reserviert ist.)

Wenn Sie in Ihrem Compiler eine Lambda-Unterstützung haben, können Sie Ihre eigene Version schreiben:

%Vor%

Das wird so verwendet:

%Vor%

es lässt Sie nicht brechen oder in den äußeren Bereich zurückkehren, aber es ist ziemlich nah an C ++ 11 auf der Grundlage von Entfernungsberechnungen für.

Wenn dir sowohl auf Distanz basierende als auch Lambdas fehlen, könntest du eine völlig wahnsinnige Person sein und viel von dem oben genannten als Makro implementieren ... Arbeitet die std::begin mit einer Hilfsfunktion mit perfekter Vorausplanung, um die Verschmutzung zu vermeiden Körper der Funktion, mayhap.

    
Yakk 20.09.2013, 02:47
quelle
5

Wahrscheinlich wird der Optimierer die Arbeit für Sie erledigen.

Übrigens, warum decltype(x.begin()) , wenn auto für dich ist?

%Vor%

oder sogar:

%Vor%

Letzteres ist das range for : Ссылка .

    
vines 20.09.2013 02:19
quelle
1

Das solltest du nicht. Da einige Operationen wie erase den Iterator ungültig machen können.

Wenn Sie sicher sind, dass solche Operationen in der for -Schleife nicht vorkommen, können Sie dies tun. Aber normalerweise wird der Compiler die Optimierung für Sie tun. (wenn Sie das Optimierungs-Flag aktivieren)

    
Yu Hao 20.09.2013 02:25
quelle

Tags und Links