2015-04-25 10 views
5

sto creando un vettore di stringhe in C++. Quello di cui ho bisogno è la memoria totale consumata in byte da questo vettore.memoria consumata da un vettore stringa in C++

Poiché le stringhe sono di dimensioni variabili, in questo momento sto iterando attraverso ogni elemento del vettore e trovandone la lunghezza, quindi alla fine lo sto moltiplicando per la dimensione del carattere. Quello di cui ho bisogno è una soluzione più pulita.

vector<string> v; 
//insertion of elements 
int len=0; 
for(int i=0;i<v.size();i++) 
        len+=v[i].length(); 
int memory=sizeof(char)*len; 

alternativamente, anche una soluzione per trovare il consumo di memoria di una stringa di array. diciamo

string a[SIZE] 

trovare il numero di byte per a?

+1

La memoria totale di un 'std :: string' non è solo la somma di' char's, c'è un overhead aggiuntivo nella classe. – CoryKramer

+1

'sizeof (char)' è 1. E 'std :: accumulate' esprime chiaramente l'intento di accumulare cose, come le lunghezze. – chris

+0

A seconda dell'implementazione, 'stringa' è memorizzato in modo diverso. Ad esempio in VS, 'stringa' ha un buffer di 16 caratteri allocato staticamente che utilizza per la velocità, quindi utilizza la memoria allocata dinamicamente se sono necessari più di 16 caratteri. – Blindy

risposta

3

Una stima approssimativa della memoria occupata da std::vector<string>:

 sizeof(std::vector<string>) // The size of the vector basics. 
     + sizeof(std::string) * vector::size() // Size of the string object, not the text 
// One string object for each item in the vector. 
// **The multiplier may want to be the capacity of the vector, 
// **the reserved quantity. 
     + sum of each string's length; 

Poiché gli oggetti vector e string non sono fissati dimensioni, ci può essere qualche ulteriore sovraccarico occupato dalle allocazioni di memoria dinamica. Ecco perché questa è una stima.

Edit 1:
Questo calcolo assume unità singolo carattere; caratteri non multibyte.

+1

Si vuole anche usare 'capacity' invece di' size() '. 'size()' riflette la quantità di memoria effettivamente in uso, ma 'capacity()' riflette la quantità di memoria effettivamente allocata. –