6 Stimmen

c++ für Schleife temporäre Variable verwenden

Welche der folgenden Möglichkeiten ist besser und warum? (Speziell für C++)

a.

int i(0), iMax(vec.length());//vec is a container, say std::vector
for(;i < iMax; ++i)
{
  //loop body
}

b.

for( int i(0);i < vec.length(); ++i)
{
  //loop body
}

Ich habe Ratschläge für (a) wegen des Aufrufs der Längenfunktion gesehen. Das beunruhigt mich. Optimiert nicht jeder moderne Compiler (b) so, dass es ähnlich wie (a) ist?

1 Stimmen

Sollte wahrscheinlich in vec.size() geändert werden

1 Stimmen

Sehr interessante Antworten. Erstaunlich, wie einfache Fragen auf Stack Overflow eine Quelle für große Bildung sein können.

1 Stimmen

@Amod: Bitte beachten Sie die Antwort von Andrew Shepherd: die beiden von Ihnen angegebenen Codeblöcke sind NICHT gleichwertig!

2voto

nsanders Punkte 11482

Sofern Sie die Schleifenvariable nicht außerhalb der Schleife benötigen, ist der zweite Ansatz vorzuziehen.

Mit Iteratoren erhalten Sie eine ebenso gute oder bessere Leistung. (Es gab einen großen Vergleich Thread auf comp.lang.c++.moderated ein paar Jahren zurück).

Außerdem würde ich Folgendes verwenden

int i = 0;

Anstelle der konstruktorähnlichen Syntax, die Sie verwenden. Obwohl gültig, ist es nicht idiomatisch.

0 Stimmen

Ich habe die Gewohnheit, fast alles auf diese Weise zu initialisieren, da ich C++ ausgiebig verwende? Ist das eine schlechte Angewohnheit?

0 Stimmen

@Amol: Das ist eine ganz andere Diskussion. Es ist in keiner Weise schlecht.

0 Stimmen

@nsanders: Toll, dass Sie den variablen Umfang erwähnen!

2voto

DevSolar Punkte 63096

Das hat nichts damit zu tun:

Warnung: Vergleich zwischen Ganzzahl mit und ohne Vorzeichen.

Der richtige Typ für Array- und Vektorindizes ist größe_t .

Streng nach gesprochen, in C++ ist es sogar std::vector<>::size_type .

Erstaunlich, wie viele C/C++-Entwickler dies immer noch falsch verstehen.

3 Stimmen

Ja - zumal die richtige Antwort vector<>::size_type und nicht size_t lautet.

0 Stimmen

Streng genommen, ja, Sie haben Recht. Aber ich wäre schon froh, size_t zu sehen, und die Chancen, die Leute zur Verwendung von vector<>::size_type sind ... vernachlässigbar.

0 Stimmen

Der Wert der Verwendung von vector<>::size_type gegenüber size_t ist ebenfalls vernachlässigbar. Es ist nur in Fällen nützlich, in denen man bereits mit einem Template-Container arbeitet (in diesem Fall ist container_type::size_type expliziter als size_t).

1voto

Sergey Podobry Punkte 6817

Schauen wir uns den generierten Code an (ich verwende MSVS 2008 mit voller Optimierung).

a.

int i(0), iMax(vec.size());//vec is a container, say std::vector
for(;i < iMax; ++i)
{
  //loop body
}

Die for-Schleife erzeugt 2 Assembler-Befehle.

b.

for( int i(0);i < vec.size(); ++i)
{
  //loop body
}

Die for-Schleife erzeugt 8 Assembler-Anweisungen. vec.size() ist erfolgreich inlined.

c.

for (std::vector<int>::const_iterator i = vec.begin(), e = vec.end(); i != e; ++i)
{
  //loop body
}

Die for-Schleife erzeugt 15 Assembler-Befehle (alles ist inline, aber der Code enthält viele Sprünge)

Wenn Ihre Anwendung also leistungskritisch ist, verwenden Sie a). Andernfalls b) oder c).

0 Stimmen

Interessant. Wie erfährt man die Details der Assembler-Anweisungen?

0 Stimmen

Nur dass in c der Zugriff auf die Elemente in vec weniger Assembler-Anweisungen erfordert als in a oder b.

0 Stimmen

Habe die Antwort auf Stackoverflow selbst gefunden. stackoverflow.com/questions/840321/

1voto

equackenbush Punkte 136

Es ist zu beachten, dass die Iterator-Beispiele:

for (vector<T>::iterator it=vec.begin();it!=vec.end();it++){
 //loop body
}

könnte den Schleifen-Iterator 'it' ungültig machen, wenn der Schleifenkörper eine Neuzuweisung des Vektors verursacht. Daher ist es nicht äquivalent zu

for (int i=0;i<vec.size();++i){
 //loop body
}

wobei der Schleifenkörper Elemente zu vec hinzufügt.

0voto

jrharshath Punkte 24857

Einfache Frage: Ändern Sie die vec in der Schleife?

Die Antwort auf diese Frage wird auch zu Ihrer Antwort führen.

jrh

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X