const char* vs. std::string - Speicher
-
Hallo zusammen,
wenn ich folgenden Code habe:
const char* ptxt = "Hello World!"; const std::string txt("Hello World!");Hält der char* ja die Adresse auf den C-String "Hello World!".
Die std::string Klasse hingegen macht eine Kopie [1] und hält den char* auf den neu-allokierten Speicherbereich.
1. Ist dieser Performance-Gedanke bei den heutigen Rechnern noch gerechtfertigt? (Um hierbei eine Kopie-Operation zu sparen?)
2. Gibt es eine Möglichkeit, dass die std::string-Klasse keine Kopie macht, sondern einfach auch auf den festen Speicherbereich zeigt?
Vielen Dank Euch.
Viele Grüße,
Jakob
---
[1]basic_string( const CharT* s, const Allocator& alloc = Allocator() ); 5) Constructs the string with the contents initialized with a copy of the null-terminated character string pointed to by s. The length of the string is determined by the first null character. The behavior is undefined if s does not point at an array of at least Traits::length(s)+1 elements of CharT.
-
Mittlerweile ist es wohl üblich, dass so kurze Strings ohne Heapspeicher im std::string abgelegt werden.
Wenn du jetzt nicht mehrere MB an Textkonstanten anlegen willst, würde ich mir darüber keine Gedanken machen.
-
jb schrieb:
1. Ist dieser Performance-Gedanke bei den heutigen Rechnern noch gerechtfertigt? (Um hierbei eine Kopie-Operation zu sparen?)
Kommt drauf an was dein Programm macht. Wenn die Hauptaufgabe das Hin- und Herreichen von Strings die bereits zur Compilezeit festehen ist, dann ist
const char*eventuell die bessere Wahl.jb schrieb:
2. Gibt es eine Möglichkeit, dass die std::string-Klasse keine Kopie macht, sondern einfach auch auf den festen Speicherbereich zeigt?
Nein. Man kann aber natürlich konstanten Referenzen auf bereits erstellte
std::stringan Funktionen weitergeben.
-
In Zukunft wird es im C++ Standard wahrscheinlich die Klasse string_view geben. Die ermöglicht es unter anderem, einem statischen C-String ein std::string-ähnliches Interface überzustülpen. Dann hat man quasi die Vorteile beider Welten. Implementierungen gibt es auch bereits.
-
Ich verwende beim übergebem von strings immer noch const char* bzw const char16_t*.
-
TNA schrieb:
In Zukunft wird es im C++ Standard wahrscheinlich die Klasse string_view geben. Die ermöglicht es unter anderem, einem statischen C-String ein std::string-ähnliches Interface überzustülpen. Dann hat man quasi die Vorteile beider Welten. Implementierungen gibt es auch bereits.
Mist. Daran arbeite ich gerade.
Also, ich meine Nicht-Mist, kann mich wichtigeren Sachen zuwenden und string_view abwarten.
Danke für die Info!
-
1. Ist dieser Performance-Gedanke bei den heutigen Rechnern noch gerechtfertigt? (Um hierbei eine Kopie-Operation zu sparen?)
2. Gibt es eine Möglichkeit, dass die std::string-Klasse keine Kopie macht, sondern einfach auch auf den festen Speicherbereich zeigt?
Gibt durchaus Situationen, in denen der Zeiger auf den statischen Speicher zu bevorzugen ist.
Hatte mal die Situation, eine Unmenge von Substrings aus einem großen Text erstellen zu müssen. Da brachte es deutliche Vorteile, den Text nur einmal im Speicher abzulegen und stattdessen eine Stringklasse zu bauen, welche nur Beginn und Endadresse des Substrings kennt. Die Klasse kann man dann so ausbauen, wie man es braucht (z.B. std::string ähnlich).
P.S.: im Normalfall ist std::string aber absolut ausreichend!!