我想计算当我创建和分配值为字符串时分配多少内存。
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;
我的字符串所消耗的所有记忆是吗?我通过简单地调用大小(在我的机器上为40个字节)而获得的初始/静态部分plus
动态部分 - 一个角色的大小,分配的占位符,用于使字符串有效地重新溶解的分配的占位符(在我的机器上,字符串首先分配了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()
i使用std::vector<std::string>
利用它们定义了完整订单,而仅使用比较操作员。在添加字符串的capactiy之前,累加器测试用于应用小弦乐优化(SSO)。当然,所有0个容量字符串都可以共享相同的静态分配终结器。或容量和/或长度可以与字符数据一起分配。 尽管如此,除了内存管理系统的开销外,对于使用的内存来说,这应该是一个很好的近似值。 这个问题将很难回答。 天真的您会认为消耗的记忆总量将是
auto netto_memory_use(std::vector<std::string> const& x) noexcept {
return std::accumulate(
begin(x),
end(x),
sizeof x + sizeof x[0] * x.capacity(),
[](auto n, auto&& s) {
if (std::less<void*>()(data(s), &s)
|| std::greater_equal<void*>()(data(s) + s.capacity(), &s + 1))
return n + s.capacity() + 1;
return n;
});
}
,但这是更高的限制,而不是实际消耗的限制。 例如,复用字符串优化允许
std::less<void*>
将字符串数据存储在存储中,字符串对象本身消耗的(您称为静态大小)。 如果是这种情况,那么所消耗的实际空间将为
向量中每个字符串的容量将是您在不分配任何额外空间的情况下占用多少空间。 您将需要检查您的实现,以查看它是否使用SSO和将其长的字符串存储在字符串对象中,以实际知道容量值是使用字符串内部空间还是实际消耗其他内存。这使实际的空间消耗了
vector_capacity * sizeof(std::string) + sum_of_capacity_of_each_string_in_the_vector
在您的计算中不需要。 std::string
使用
vector_capacity * sizeof(std::string)
保证是vector_capacity * sizeof(std::string) + sum_of_capacity_of_each_string_in_the_vector_where_
the_capcity_is_more_than_the_sso_amount
有一个简单的原因,为什么字符串的能力比您预期的要少。
sizeof(cache[i].at(0))
AC ++字符串存储在存储器块中,容量为使用的空间提供了总尺寸和大小。但是C字符串为0终止。 C ++字符串在内存块的末端保留一个额外的字节以存储一个0。这样的方式
std::string
总是终止0。
因此,字符串的动态部分使用的内存是容量 +1.我认为,nathanoliver的字符串或字符串向量所消耗的总记忆回答了我认为。但是要当心载体多次握住同一字符串。