2009-02-17 9 views
23

Qual è l'overhead di memoria di avere un vettore vuoto rispetto a un puntatore a un vettore?Qual è il costo generale di un vettore vuoto?

Opzione A:

std::vector<int> v; 

Opzione B:

std::vector<int> *v = NULL; 

credo che l'opzione B prende 1 32 pointer di selezione bit (supponendo 32 bit qui) Quanta memoria ha il 'v' vuoto occupare?

+0

Sarebbe bello sapere cosa stai cercando di ottenere con questa domanda. Stai cercando di realizzarne una serie e vuoi sapere quanto spazio risparmia facendo una serie di puntatori? Se è così, ci sono probabilmente altri problemi che dovresti sapere. –

risposta

0

Implementazione dipendente, probabilmente un puntatore e due numeri interi per dimensioni e capacità attuali.

5

std::vector v; occupa sizeof(v) spazio. Potrebbe variare in base all'implementazione, quindi eseguilo e scopri quanto ci vuole.

+0

E che dire della memoria dinamica utilizzata internamente dal vettore? –

+1

Un vettore predefinito non ha dimensioni e non ne ha mai avuto, quindi non dovrebbe avere alcuna allocazione dinamica. –

12

È completamente dipendente dall'implementazione e non si deve assumere né contare sui dettagli. Per quello che vale è 20-byte che usano VC.

+0

In GCC 4.6, è 12 byte. Assumerei 4 byte per il puntatore, 4 byte per la dimensione e 4 byte per la capacità. – Joel

31

Per quanto riguarda la domanda come richiesto: dipende dall'implementazione. Con MSVC 7.1 questo:

std:: cout << sizeof(std::vector<int>) << std::endl; 

mi dà 16 (byte). (3 punti: inizio, fine, e la fine della capacità, più un allocatore)

Tuttavia va notato che il vettore puntatore a conferisce un maggiore overhead:

  • in termini di tempo e spazio nel caso non vuoto
  • in termini di complessità in tutti i casi.
+3

l'ultimo punto è molto buono. +1 per quello –

+0

Perché un puntatore al vettore ha un sovraccarico maggiore? –

+0

@Legate: beause devi aggiungere la dimensione del puntatore stesso alla dimensione del vettore –

3

VS2005:

std::vector<int> *ptrToVec = new std::vector<int>(); 
std::vector<int> vecOfInt; 

sizeof(ptrToVec) = 4 
sizeof(vecOfInt) = 20 

Grazie!

1

In Visual Studio comunitaria 2017 (versione 15.2), l'esecuzione di questo codice:

#include <iostream> 
#include <vector> 

using namespace std; 

void main() 
{ 
    vector<float> test; 
    vector<float>* test2 = &test; 
    cout << sizeof(test) << "\n"; 
    cout << sizeof(test2) << "\n"; 

    cout << "\n"; 
    system("pause"); 
} 

Esecuzione in 32 bit (x86), ottengo 16 byte per il vettore e 4 byte per il puntatore del vettore.

Esecuzione in 64 bit (x64), ottengo 32 byte per il vettore e 8 byte per il puntatore del vettore.

Problemi correlati