Tatsächliche Größe im Speicher bei vector Array

Hallo!

Ich habe eine kurze Frage zur Speicherverwaltung.
Wenn ich eine vector array im Heap erstelle und an verschiedenen Indexen daten per push_back einfüge, wie groß ist der tatsächliche Speicherverbrauch?

Beispielcode:

vector \*v = new vector[10];
v[1].push\_back(3);
v[1].push\_back(8);
v[5].push\_back(88);

Die funktion sizeof() gibt mir in diesem Fall für den Pointer *v eine Größe von 4 aus - aber für jedes einzelne v[i] eine Größe von 12.
Wird dort die gesammte Größe des Vektorarrays angezeigt oder wird jedes Element der maximalen Größe nach aufgebläht?
Ich hoffe, ich habe mich einigermaßen verständlich ausgedrückt :wink:

Grüße

Björn

Hallo

Wenn ich eine vector array im Heap erstelle und an
verschiedenen Indexen daten per push_back einfüge, wie groß
ist der tatsächliche Speicherverbrauch?
vector *v = new vector[10];
v[1].push_back(3);
v[1].push_back(8);
v[5].push_back(88);
Die funktion sizeof() gibt mir in diesem Fall für den Pointer
*v eine Größe von 4 aus - aber für jedes einzelne v[i] eine
Größe von 12.

Du bastelst Dir hier ein 2-dimensionales Array, die
erste Dimension v[…] erzeugst Du mit ‚new‘ und gibst
10 Elemente vor, v ist der Anfang dieses 10-elementigen
Blocks (Zeiger sind immer 4 bytes in 32bit-Systemen).

‚new‘ erzeugt für jeden Einzelnen dieser vector’s
einen Block von sizeof(v[i]) hintereinander.

Jedes v[i] ist dann der Startpunkt der 2. Dimension
v[i][j], hier benutzt Du den vector-eigenen
Allokationsmechanismus, der hinter push_back
arbeitet. Jede Spalte der 2. Dimension hat die
Größe vector[i].capacity(), die Größenformel
wäre also:

 größe = 0
 FOR(i=0 BIS 10) 
 größe += sizeof( v[i] ) + v[i].capacity() \* sizeof(int)

Grüße

Das Ganze hättest Du auch mit

 vector \>vv;
 vv.resize(10);
 vv[1].push\_back(3);
 vv[1].push\_back(8);
 vv[5].push\_back(88);

haben können.

CMБ

Danke! (ot)
ohne text