Я хочу вычислить, сколько памяти выделяется при создании и назначении значений для строки.
string s = "";
cout << sizeof(s) << endl;
cout << sizeof(s.at(0)) * s.capacity() << endl;
s = "1234567890qwertz";
cout << sizeof(s) << endl;
cout << sizeof(s.at(0)) * s.capacity() << endl;
Это вся память, которую использует моя строка? Начальная / статическая часть, которую я получаю, просто вызывая sizeof (s) (будучи на моей машине 40 байт) плюс динамическая часть - размер одного символа, умноженный на заполненные заполнители для эффективного изменения размера строк (on На моей машине строка s сначала выделяла блок из 15 байт до точки, где текст слишком длинный, поэтому после второго назначения динамическая часть составляет 31 байт). Почему не 16 а 32 байта кстати?
Правильно ли думать об этом (статический + динамический для каждой строки - вся занимаемая память)?
Это означает, что если у меня есть std :: vector строк, и я хотел бы также рассчитать всю память для этого вектора, мне нужно было бы сделать то же самое: я добавляю исходный / статический размер моего вектор, чтобы получить плюс динамическая часть, что означает общий объем памяти, занимаемый одной строкой, как я делаю это выше для каждой строки внутри вектора?
vector<string> cache;
// fill cache with strings of dynamic length
int size = sizeof(cache);
for (int i = 0; i < cache.size(); i++)
{
size += sizeof(cache[i]);
size += sizeof(cache[i].at(0)) * cache[i].capacity();
}
Итак, чтобы подвести итог, правильный ли это объем памяти, занятый моим "кэшем"?
Edit:
Или мне также нужно принять во внимание, что сам std :: vector также имеет .capacity ()> = .size (), что может означать, что мне действительно нужно сделать это:
для каждого cache.capacity()
- мне нужно было бы добавить sizeof(cache[i])
и дополнительно
за каждый cache.size()
- добавить sizeof(cache[i].at(0)) * cache[i].capacity()
??