gpt4 book ai didi

c++ - std::set 和内存

转载 作者:太空宇宙 更新时间:2023-11-04 11:33:36 26 4
gpt4 key购买 nike

我使用 Ms Visual Studio2010 Express 并有下一个代码

set<string> res;
for(uint x = 0; x<100000;++x) res.insert( vtos(x,0) );
uint size1=0;uint size2=0;uint size3=0;
set<string>::const_iterator it=res.begin();
for(;it!=res.end();++it){
string str = *it;
size1+=str.size();
size2+=str.capacity();
size3+=str.capacity() + sizeof(string);
}
cout << "size1 == " << ((float)size1)/1024/1024 << endl;
cout << "size2 == " << ((float)size2)/1024/1024 << endl;
cout << "size3 == " << ((float)size3)/1024/1024 << endl;
while(true){}

输出是

size1 == 0.466242
size2 == 1.43051
size3 == 4.1008

循环(最后,这是坏事,我知道)仅用于监视 TaskManager。在 TaskManager 中,我看到我的应用程序的内存是 6,11 Mb

为什么是6M? ~2Mb 在哪里?

如果我用 vector 替换设置(调整大小为 100000),输出将相同,但在任务管理器中我看到 ~3,45Mb。

为什么是 3 Mb?

对不起,我的英语不好,提前谢谢你。

最佳答案

set size 和其他内存使用在评论中已经回答。

vector 使用的空间少于您计算出的 4.1MB,因为 visual studio 的 std::string 会将小字符串存储在字符串内部的缓冲区中。如果字符串大于缓冲区,它将分配一个动态缓冲区来存储该字符串。这意味着 str.capacity() + sizeof(string) 对于小于该缓冲区大小的值是不正确的(在您的情况下,这是您的所有字符串,因为 Visual C 的缓冲区恰好是 16字节)。

尝试在字符串中使用更大的值来运行它。例如在将每个值放入 vector 之前,将常量字符串“12345678901234567890”添加到每个值中,并且您的内存使用量应该增加超过 200k (20*10,000) 以获得额外数据,因为字符串必须开始分配动态缓冲区。

关于c++ - std::set<string> 和内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23647756/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com