Я хочу подсчитать, сколько памяти выделяется при создании и присвоении значений строке.
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 байт на моей машине) плюс динамическая часть - размер одного символа, умноженный на выделенные заполнители, для обеспечения эффективного изменения размера строк ( на моей машине строка 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();
}
Итак, чтобы подвести итог, это правильный объем памяти, занятый моим "кешем"?
Изменить: Или мне также нужно принять во внимание, что сам std :: vector также имеет .capacity ()> = .size (), что может означать, что мне действительно нужно сделать это:
для каждого cache.capacity()
- мне нужно добавить sizeof(cache[i])
и дополнительно для каждого cache.size()
- добавить sizeof(cache[i].at(0)) * cache[i].capacity()
??
sizeof(s)
- это размер объектаs
, а не самой строки. Если нет какой-либо оптимизации коротких строк (которая хранит содержимое внутри фактического строкового объекта), тогдаstd::string
на самом деле не более чем пара размеров и указатель на фактические строковые данные. - person Some programmer dude   schedule 17.01.2019std::string
объекту потребуется место. - person Some programmer dude   schedule 17.01.2019std::vector<std::string>>
. - person Slava   schedule 17.01.2019std::string
есть методsize()
, который даст вам его размер в байтах. - person Nadir   schedule 17.01.2019size()
возвращает количество допустимыхchar
в строке. Неважно, хранятся ли символы в динамической памяти или во внутреннем буфере SSO.capacity()
возвращает фактическое количество выделенных символов, но также не делает различий между динамической памятью и памятью SSO. Вы не можете получить истинный размер байтаstd::string
, не зная внутренних деталей его реализации. - person Remy Lebeau   schedule 17.01.2019