2015-04-25 12 views
5

Tworzę wektor ciągów w C++. Potrzebuję całkowitej pamięci zużywanej w bajtach przez ten wektor.pamięć zużywana przez wektor łańcuchowy w C++

Ponieważ ciągi mają zmienny rozmiar, teraz wykonuję iterację poprzez każdy element wektorowy i znajdując jego długość, a następnie na końcu pomnożę to do rozmiaru znaku. Potrzebuję czystszego rozwiązania.

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; 

alternatywnie rozwiązaniem byłoby również znaleźć zużycie pamięci tablicy napisów. załóżmy, że

string a[SIZE] 

znaleźć liczbę bajtów dla?

+1

Całkowita pamięć 'std :: string' to nie tylko suma' char's, ale dodatkowe obciążenie w klasie. – CoryKramer

+1

'sizeof (char)' is 1. I 'std :: accumulate' wyraźnie wyraża zamiar gromadzenia rzeczy, takich jak długości. – chris

+0

W zależności od implementacji 'ciąg' jest przechowywany inaczej. Na przykład w VS, 'string' ma 16-znakowy bufor przydzielony statycznie, który wykorzystuje do prędkości, a następnie wykorzystuje dynamicznie przydzieloną pamięć, jeśli potrzebujesz więcej niż 16 znaków. – Blindy

Odpowiedz

3

A rough oszacowanie pamięci zajmowanej przez 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; 

Od vector i string nie są ustalone wielkości obiektów, nie mogą być pewne dodatkowy narzut zajęte przez dynamicznych alokacji pamięci. Właśnie dlatego jest to szacunek.

Edytuj 1:
Powyższe obliczenia zakładają jednostkę z pojedynczym znakiem; nie znaki wielobajtowe.

+1

Należy również użyć 'capacity' zamiast' size() '. 'size()' odzwierciedla ilość pamięci, która jest faktycznie w użyciu, ale 'capacity()' odzwierciedla ilość faktycznie przydzielonej pamięci. –