PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [ERLEDIGT] Kurze frage zu strlen() und length()



hirnfrei
08.03.2016, 10:54
Mahlzeit!

Als ich mit C angefangen hatte habe ich gelernt, dass es sinnvoll ist keine Funktion in eine Schleife einzubauen, da diese ansonsten bei jedem Durchgang erneut durchlaufen werden muss.



Beispiel:

Anstatt:

for(i=0;i<strlen(bla);i++)

Besser:

bis = strlen(bla);

for(i=0;i<bis;i++)


Seitdem ich nun auf C++ aufgesprungen bin sehe ich aber sehr oft in Tutorials zum Beispiel


for(i=0;i<bla.length();i++)

Jetzt stellt sich mir die Frage, ist es bei C++ das gleiche spiel und length() wird jetzt wieder bei jedem Durchlauf ebenfalls durchlaufen, oder hat C++ da etwas eingelötet, was eine Schleife erkennt und demnach nur einmal length() abruft? Lustig wäre das ja schon, aber ich habe leider immer wieder das Gefühl, je mehr Rechenleistung und Speicher die Rechner kriegen, um so weniger Interesse zeigen die Leute beim Sparen.

Mxt
08.03.2016, 11:31
Hallo,

die beiden Dinge sind nicht exakt das gleiche, deshalb unterscheiden sie sich auch etwas in ihrem Verhalten.

strlen ist eine Funktion, die die Länge von nullterminierten C Strings zurückgibt. Die muss also bei jedem Aufruf durch den Speicher laufen und bis zur nächsten Null laufen.

C++ Strings sind nicht nullterminiert, sie können auch Nullzeichen enthalten und funktionieren dann immer noch. Der Aufruf von length durchläuft nicht den string, sondern liefert eine Membervariable der Klasse zurück, die die Anzahl der (wirklich) gespeicherten Zeichen zurückgibt. (Der interne Puffer des String Objekts kann mehr Speicherplatz vorhalten, damit beim Hinzufügen von Zeichen nicht jedesmal der String neu angelegt werden muss.)

Im übrigen "hat C++ da noch was eingebaut", es gibt seit C++11 auch noch eine zweite Art von for-Schleife:
http://en.cppreference.com/w/cpp/language/range-for

hirnfrei
08.03.2016, 11:39
Super, danke! Genau das wollte ich wissen!