当前位置: 首页 > 知识库问答 >
问题:

计算std::string的分配内存(以及std::vector中字符串的使用)

翟学文
2023-03-14
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;

这种思考方式(静态+动态对于每个字符串是它占用的全部内存)正确吗?

也就是说,如果我有一个Std::string向量,并且我也想计算该向量的所有内存,我需要做同样的事情:我把向量的初始/静态大小加到动态部分,这意味着一个字符串占用的总内存,就像上面对向量中的每个字符串所做的那样?

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();
}

总而言之,这是我的“缓存”占用的正确内存量吗?

对于每个cache.capacy()-我需要添加sizeof(cache[I]),另外对于每个cache.size()-添加sizeof(cache[I].at(0))*cache[I].capacy()??

共有1个答案

魏明亮
2023-03-14

这个问题很难回答。你会天真地认为消耗的内存总量是

vector_capacity * sizeof(std::string) + sum_of_capacity_of_each_string_in_the_vector

但这更多的是一个上限,而不是实际可以消费的东西。例如,短字符串优化允许std::string将字符串数据存储在string对象本身使用的存储区(您称之为静态大小)中。如果是这种情况,那么实际消耗的空间将是

vector_capacity * sizeof(std::string)

向量中每一个字符串的容量,就是在不分配任何额外空间的情况下,占用的空间。您将需要检查您的实现,看看它是否使用SSO和它将存储在string对象中的字符串的长度,以实际了解容量值是使用字符串内部空间还是实际消耗额外的内存。这使得实际占用的空间

vector_capacity * sizeof(std::string) + sum_of_capacity_of_each_string_in_the_vector_where_
                                        the_capcity_is_more_than_the_sso_amount
 类似资料:
  • 我正在尝试连接两个现有的代码库——一个在C中,另一个在C中。C代码使用std::vector,而另一个基于double数组。我想从C代码中传递double数组,对C代码中的std::vectors执行操作,并最终在double数组中反映这些操作。 有没有可能创建一个std::vector来匹配double数组占用的内存? 我已经尝试了几个选项,但是它们都涉及到创建一个新的向量和一个双向量数组的副本

  • 错误:无法将类型为“std::_bit_reference&”的非常量lvalue引用绑定到类型为“std::vector::reference”{aka“std::_bit_reference”}的rvalue 因此,它抱怨,因为只有第二个参数是rvalue

  • 我在std::sort中发现了一个bug,特别是在一些QuickSort的实现中,我不知道问题是否出在一般的算法中。 精华: 当元素小于16时,所有的规范都被替换,因为std::sort使用插入排序。 当有17个或更多的元素时,使用快速排序,并从元素数量的对数限制递归深度,但向量在第一次__introsort_loop迭代时有时间恶化。 当有许多相同的元素时,就会出现向量损坏。用无效迭代器替换有效

  • 在开始之前,我需要说明我的应用程序使用了大量的字符串,这些字符串平均来说非常小,并且一旦创建就不会改变。 在Visual Studio 2010中,我注意到std::string的容量至少为30。即使编写,str的容量也是30。函数对此没有任何作用,尽管存在一个与std::vector同名的函数,并按预期工作,即减小容量,使容量==size。 null

  • 好的,我最近了解到(a)std::vector根据定义/标准使用连续内存,因此(b) 好吧,这很酷,但我想换个方向。我有很多现有的代码,比如 如果我有一个对象的C数组,我可以使用这样的代码: 我想这样做,(a)没有额外的空间,(b)没有额外的时间将所有数据的冗余副本插入向量。请注意,“只改变你愚蠢的计算方式,白痴”是不够的,因为有数千个这样的函数/方法展示了这种模式,而这些函数/方法不在我的控制之

  • 下面的代码显示了我要做的: