Frage

Ich bin auf einer 64 -Bit -Plattform, daher sind alle Speicher -ADRs 8 Bytes.

Um eine Schätzung der Speicherverwendung eines Arrays zu erhalten, sollte ich für jeden Eintrag im Array 8 Bytes zur Größe (DataType) hinzufügen.

Beispiel:

short unsigned int *ary = new short unsigned int[1000000]; //length 1mio
//sizeof(short unsinged int) = 2bytes 
//sizeof(short unsinged int*) = 8 bytes

Nimmt jeder Eintrag 10 Bytes auf? Und wird mein 1 -mio -Länge -Array daher mindestens 10 Megabyte verwenden?

Danke

War es hilfreich?

Lösung

Nein, Sie erhalten keinen Zeiger für jeden Array -Index. Sie erhalten einen einzelnen Zeiger, der auf das Array zeigt, was ein zusammenhängender Speicherblock ist. Deshalb kann die Adresse eines Index aus dem Index selbst plus der Array -Adresse berechnet werden.

Zum Beispiel, wenn die Variable a unter dem Speicherort bekannt 0xffff0012 ist eingestellt auf 0x76543210, Dann könnten sie in Erinnerung angelegt werden wie:

            +-------------+ This is on the stack or global.
0xffff0012  |  0x76543210 |
            +-------------+

            +-------------+ This is on the heap (and may also
0x76543210  |  a[     0]  |   have some housekeeping information).
            +-------------+
0x76543212  |  a[     1]  |
            +-------------+
0x76543214  |  a[     2]  |
            +-------------+
0x76543216  |  a[     3]  |
            +-------------+
               :       :
            +-------------+
0x7672B68E  |  a[999999]  |
            +-------------+

und Sie können sehen, dass die Adresse des Index n ist 0x76543210 + n * 2.

Sie haben also tatsächlich einen 8-Byte-Zeiger und eine Million 2-Byte-Shorts, die in Ihrem Fall 2.000.008 Bytes belaufen.

Dies ist über allen hinaus malloc Housekeeping Overhead, das wie der Zeiger selbst im Vergleich zu Ihrem tatsächlichen Array winzig ist.

Andere Tipps

Nein, hier gibt es nur einen einzelnen Zeiger, keinen Zeiger pro Eintrag. Ihre Größenschätzung beträgt 1000000*2 + 8.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top