【发布时间】:2019-01-17 13:52:51
【问题描述】:
我想计算在创建字符串并将值分配给字符串时分配了多少内存。
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;
这是我的字符串 s 消耗的所有内存吗?我通过简单地调用 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)是 objects的大小,而不是字符串本身。除非有一些短字符串优化(将内容存储在实际字符串对象中),否则std::string实际上只不过是几个大小和一个指向实际字符串数据的指针。 -
@huzzm 是的,虽然有些字符串可能根本不分配内存。
-
@huzzm 全局/静态字符串,小字符串优化。
标签: c++ string memory sizeof allocation