Unterschiede zwischen sizeof-Operator und strlen-Funktion für Strings in C++

Jinku Hu 12 Oktober 2023
  1. Der sizeof-Operator Merkmale und Anwendungsszenarien
  2. Verwendung von die Member-Funktion std::string::size zum Abrufen der Anzahl der Zeichen in Zeichenketten
Unterschiede zwischen sizeof-Operator und strlen-Funktion für Strings in C++

Dieser Artikel zeigt mehrere Unterschiede bei der Verwendung des Operators sizeof im Gegensatz zur Funktion strlen mit Strings in C++.

Der sizeof-Operator Merkmale und Anwendungsszenarien

Der Operator sizeof ist ein unärer Operator, der die Speichergröße für den angegebenen Ausdruck oder Datentyp abruft. Dieser Operator wertet die Objektgröße in Byte-Einheiten aus und sizeof(char) ist garantiert 1.

Es gibt die falsche Vorstellung, dass 1 Byte immer 8 Bit entspricht, und folglich können wir die Größe des Objekts in Bit berechnen. Tatsächlich wird von der Sprache selbst nicht garantiert, dass ein Byte aus 8 Bit besteht. Es hängt hauptsächlich von einer zugrunde liegenden Hardwareplattform ab. Dennoch verwendet die meiste moderne Allzweck-Hardware 8-Bit-Bytes.

Beachten Sie, dass der Operator sizeof nicht auf einen Ausdruck angewendet werden kann, der eine Funktion oder einen unvollständigen Typ oder Bitfelder enthält. Im folgenden Beispielcode wenden wir den Operator sizeof auf zwei Arrays unterschiedlichen Typs an, und die Ergebnisse werden wahrscheinlich auch auf Ihrer Plattform gleich sein. Da das char garantiert 1 Byte groß ist, nimmt das 20-Zeichen-Array 20 Byte ein.

Andererseits ist der Datentyp long long implementierungsdefiniert und hat in diesem Fall 8 Bytes. Daher die gesamte Array-Größe von 160 Byte. Beachten Sie, dass wir die Anzahl der Elemente im Array auch finden können, indem wir die sizeof des gesamten Arrays durch die sizeof eines Elements dividieren, wie in den letzten Zeilen des nächsten Beispiels gezeigt.

#include <iostream>

using std::cout;
using std::endl;

int main() {
  char arr[20];
  long long arr2[20];

  cout << "sizeof ( array of 20 long longs ) : " << sizeof arr << endl;
  cout << "sizeof ( array of 20 long longs ) : " << sizeof arr2 << endl;
  cout << "length of array of 20 chars)      : "
       << ((sizeof arr) / (sizeof arr[0])) << endl;
  cout << "length of array of 20 long longs ): "
       << ((sizeof arr2) / (sizeof arr2[0])) << endl;

  return EXIT_SUCCESS;
}

Ausgabe:

sizeof ( array of 20 long longs ) : 20
sizeof ( array of 20 long longs ) : 160
length of array of 20 chars)      : 20
length of array of 20 long longs ): 20

Die Verwendung des Operators sizeof zum Ermitteln der Länge des Strings ist falsch. Betrachten wir zwei Darstellungsarten von Strings in C++, eine Zeichenkette und eine std::string-Klasse. Auf erstere wird meistens mit dem Zeiger char zugegriffen, und das Anwenden von sizeof darauf ruft die Speichergröße des Zeigers selbst und nicht den gesamten String ab.

Wenn wir versuchen, die Größe des Objekts std::string mit dem Operator sizeof abzurufen, erhalten wir die Speichergröße des Objekts, die nicht der Anzahl der Zeichen im String entspricht, wie im folgenden Code-Snippet gezeigt.

#include <cstring>
#include <iostream>
#include <string>

using std::cout;
using std::endl;
using std::string;

int main() {
  const char *text1 = "arbitrary string value 1";
  string text2 = "arbitrary string value 2";

  cout << "sizeof char* : " << sizeof text1 << endl;
  cout << "sizeof string: " << sizeof text2 << endl;
  cout << "sizeof string.data: " << sizeof text2.data() << endl;

  return EXIT_SUCCESS;
}

Ausgabe:

sizeof char* : 8
sizeof string: 32
sizeof string.data: 8

Dann haben wir die Funktion strlen, das Überbleibsel der C-String-Bibliothek. Sie berechnet die Länge der gegebenen Zeichenkette und die Funktion gibt die Anzahl der Bytes als ganzzahligen Wert zurück. strlen kann auf den char-Zeiger angewendet werden, in dem ein gültiger String gespeichert ist, oder auf den von std::string::c_str zurückgegebenen Wert, aber es sollte nicht die Wahl des C++-Programmierers sein.

#include <cstring>
#include <iostream>
#include <string>

using std::cout;
using std::endl;
using std::string;

int main() {
  const char *text1 = "arbitrary string value 1";
  string text2 = "arbitrary string value 2";

  cout << "strlen char* : " << strlen(text1) << endl;
  cout << "strlen string: " << strlen(text2.c_str()) << endl;

  return EXIT_SUCCESS;
}

Ausgabe:

strlen char* : 24
strlen string: 24

Verwendung von die Member-Funktion std::string::size zum Abrufen der Anzahl der Zeichen in Zeichenketten

Im Gegenteil, der C++-Programmierer sollte die Memberfunktion size der Klasse std::string verwenden, da sie eine sicherere Methode für den Umgang mit Strings bietet. Beachten Sie, dass wir die Memberfunktion size sogar verwenden können, wenn wir eine Zeichenkette haben. Wir müssen ein neues string-Objekt konstruieren und direkt die size-Funktion für den zurückgegebenen Wert aufrufen. Das folgende Codebeispiel zeigt die primäre Verwendung für beide Szenarien.

#include <cstring>
#include <iostream>
#include <string>

using std::cout;
using std::endl;
using std::string;

int main() {
  const char *text1 = "arbitrary string value 1";
  string text2 = "arbitrary string value 2";

  cout << "length char* : " << string(text1).size() << endl;
  cout << "length string: " << text2.size() << endl;

  return EXIT_SUCCESS;
}

Ausgabe:

length char* : 24
length string: 24
Autor: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn Facebook

Verwandter Artikel - C++ String