Wie groß ist ein std::string
-
-string hat zwei zeiger plus die
-verwalteten daten, ein char pro zeichen plus nullterminator, zwei zeiger dazu fürs freispeichermanagement, das ganze aufgerundet auf die nächste 32-byte-grenze.
aber je nach string kanns auch anders sein. referenzzähler für copy-on-write. und natürlich small string optimisazion.
schau doch einfach in die implemetierung rein.
-
edit: leider war der code ein wenig zu fehlerhaft^^
#include <iostream> #include <string> void print_size(const std::string &x) { std::cout << "groesse von: \'" << x << "\':" << std::endl << "stack: " << sizeof(x) << std::endl << "heap: >=" << x.capacity() * sizeof(std::string::value_type) << std::endl; } int main() { std::string a; std::string b("ASD"); std::string c("def"); print_size(a); print_size(a+b); print_size(a+b+c); print_size(b); print_size(b+c); print_size(c); system("PAUSE"); }
MSVC9, 32bit, Debug schrieb:
stack: 32
heap: >=15überall
MSVC9, 32bit, Release schrieb:
stack: 28
heap: >=15überall
bin ich selbst ein wenig überrascht, aber ok : D
bb
-
Man kann auch einen String mit nur einem Zeiger implementieren. Das scheint libstdc++ (GCC) so zu machen. Jedenfalls bekomme ich bei sizeof(std::string) die Ausgabe 4. Was im Heap angelegt wird, wenn man den String füllt, weiß ich natürlich nicht genau. Es ist mindestens die Kapazität, die Länge des Strings und die Zeichen selbst. Eventuell noch ein Referenzzähler vielleicht...
Gruß,
SP
-
-
Sebastian Pizer schrieb:
Man kann auch einen String mit nur einem Zeiger implementieren. Das scheint libstdc++ (GCC) so zu machen. Jedenfalls bekomme ich bei sizeof(std::string) die Ausgabe 4. Was im Heap angelegt wird, wenn man den String füllt, weiß ich natürlich nicht genau. Es ist mindestens die Kapazität, die Länge des Strings und die Zeichen selbst. Eventuell noch ein Referenzzähler vielleicht...
Gruß,
SPhmm... dann müsste man die länge oder nen ptr auf das ende auf dem heap speichern, da size() eine konstante laufzeit haben soll - erscheint mir gerade ein wenig eigenartig - aber die, die sich das ausdenken haben sicherlich bissl mehr ahnung als ich^^
vrmtl. wirds aber so in etwa aussehen:template < /* .... */ > struct basic_string { private: std::vector *content; public: /*...*/ };
bb
-
TGGC schrieb:
Moechte evtl. jemand mal die stlport messen?
MSVC 2005, 32bit, Release, stlport schrieb:
stack: 24
heap: >=15überall
So, habs mal gemacht. f'`8k
AutocogitoGruß, TGGC (Was Gamestar sagt...)
-
unskilled schrieb:
hmm... dann müsste man die länge oder nen ptr auf das ende auf dem heap speichern, da size() eine konstante laufzeit haben soll - erscheint mir gerade ein wenig eigenartig
Mir nicht. Für's Copy-On-Write ist es eh eine gute Idee, daß der String quasi pimplt.
template < /* .... */ > struct basic_string { private: basic_string_imp *imp; public: bar foo() const{ return impl->foo(); } bar foo() { impl=getCopyAnsRealeaseIfNotAllone(impl); return impl->foo(); } ... };
class basic_string_imp { int refcount; char* begin; char* end; ... };
-
uhm..... ich will euch ja nicht den Spass verderben, aber die exakte Antwort ist
sizeof(std::string);
-
Blue-Tiger schrieb:
uhm..... ich will euch ja nicht den Spass verderben, aber die exakte Antwort ist
sizeof(std::string);
ich will dir ja nicht den spaß verderben, aber guck mal den 4. post an^^
bb
-
unskilled schrieb:
Blue-Tiger schrieb:
uhm..... ich will euch ja nicht den Spass verderben, aber die exakte Antwort ist
sizeof(std::string);
ich will dir ja nicht den spaß verderben, aber guck mal den 4. post an^^
bb
hoppla.... da war so viel Code, das sah mir nach 'ner komplizierteren Loesung aus. Schande ueber mich
*in die Ecke stell*