2015-12-01 6 views
22

Stavo solo scherzando e imparando a conoscere sia i vettori che le strutture e, a un certo punto, ho provato a trasmettere la dimensione di un vettore in byte. Ecco il codice:C++ sizeof Vector è 24?

#include <iostream> 
#include <vector> 

struct Foo{ 
    std::vector<int> a; 
}; 

int main() 
{ 
    using std::cout; using std::endl; 

    Foo* f1 = new Foo; 

    f1->a.push_back(5); 
    cout << sizeof(f1->a) << endl; 
    cout << sizeof(f1->a[0]) << endl; 

    delete[] f1; 
} 

L'uscita è 24 e 4.

Ovviamente la seconda riga ha stampato 4, perché quella è la dimensione di un int. Ma perché esattamente l'altro valore 24? Un vettore occupa 24 byte di memoria? Grazie!

+9

Un vettore è di solito [implementato con tre puntatori ] (http://stackoverflow.com/questions/30422205/why-the-libc-stdvector-internally-keeps-three-pointers-instead-of-one-pointe) – jaggedSpire

+1

Questa è la dimensione di 'classe std :: vector '. È dipendente dall'implementazione ed è la somma delle dimensioni dei membri di tale classe. Di solito un puntatore all'array C-style sottostante e vari membri come dimensioni, capacità e così via. – Banex

+3

Nota a margine 'delete [] f1' non è corretto, dovrebbe essere' delete f1' solo –

risposta

36

Mentre l'interfaccia pubblica di std::vector è definito dallo standard, ci possono essere diverse implementazioni : in altre parole, ciò che è sotto il cofano di std::vector può variare da un'implementazione all'altra.

Anche nella stessa implementazione (ad esempio: l'implementazione STL fornita con una determinata versione di Visual C++), le parti interne di std::vector possono essere modificate da build di versioni e build di debug.

Le 24 dimensioni che vedi possono essere spiegate come 3 puntatori (ogni puntatore ha una dimensione di 8 byte su architetture a 64 bit, quindi hai 3 x 8 = 24 byte). Questi puntatori possono essere:

  • Inizio del vettore
  • fine del vettore
  • fine della memoria riservata per il vettore (capacità cioè vettore)
+0

Aggiungi a quelle soluzioni che cercano di essere intelligenti con puntatori a 48 bit, SSO, allocatori personalizzati e la dimensione potrebbe essere ragionevolmente ovunque tra 20 e 64 byte, oltre a qualsiasi cosa allocata nell'heap. – Peter

+1

Anche 16 byte è realistico: puntatore da 8 byte all'inizio, elemento da 4 byte _count_, prenotazione da 4 byte. – MSalters