如何解决c ++程序中按映射结构的内存使用情况
在下面的程序中,当我增加字符串列表的长度,即增加len1的值时,从Windows任务管理器看到的内存使用率相应增加。但是,当我增加地图的长度,即增加len2的值时,从Windows任务管理器看到的内存使用率几乎保持不变。您能否就这个问题分享一些看法? 谢谢!
#include <iostream>
#include <map>
#include <stdio.h>
#include <unistd.h>
using namespace std;
void fillMemory(int i,int j,map<int,int> m);
class NewObject;
void fillMoreMemory(int i,NewObject> m1);
class NewObject{
long i = 0L;
long j = 0L;
long k = 0L;
};
int main()
{
map<int,int> m;
map<int,NewObject> m1;
cout << "Hello world!" << endl;
int len1=1000;
string l1[len1];
for(int i=0;i<len1;i++){
l1[i]="hello";
}
int len2=1000000;
fillMemory(1,len2,m);
fillMoreMemory(1,m1);
cout << "Hello world!" << endl;
getchar();
return 0;
}
void fillMemory(int i,int> m){
for(int k=i; k< j; k++){
m.insert(pair<int,int>(i,k));
}
}
void fillMoreMemory(int i,NewObject> m1){
for(int k=i; k< j; k++){
NewObject n;
m1.insert(pair<int,NewObject>(i,n));
}
}
解决方法
您通过函数中的值传递映射,因此从主要角度来看,函数退出时所有更改都将被丢弃。
现在,如果进行一些优化编译,程序可能永远不会在地图中插入元素。为避免这种情况,请尝试使用插入到函数内部的map元素,并在函数执行时查看结果。
但是,当函数退出时,您看不到内存比启动函数时更多。
除此之外,还用i
索引填充了地图的第一个元素。
尝试用i
替换成对的k
。
要欣赏地图中的更改,请尝试通过以下方式通过引用或指针将其传递给函数:
#include <iostream>
#include <map>
#include <stdio.h>
#include <unistd.h>
using namespace std;
void fillMemory(int i,int j,map<int,int>& m);
class NewObject;
void fillMoreMemory(int i,NewObject>& m1);
class NewObject{
long i = 0L;
long j = 0L;
long k = 0L;
};
int main()
{
map<int,int> m;
map<int,NewObject> m1;
cout << "Hello world!" << endl;
int len1=1000;
string l1[len1];
for(int i=0;i<len1;i++){
l1[i]="hello";
}
int len2=1000000;
fillMemory(1,len2,m);
fillMoreMemory(1,m1);
cout << "Hello world!" << endl;
getchar();
return 0;
}
void fillMemory(int i,int>& m){
for(int k=i; k< j; k++){
m.insert(pair<int,int>(k,k));
}
}
void fillMoreMemory(int i,NewObject>& m1){
for(int k=i; k< j; k++){
NewObject n;
m1.insert(pair<int,NewObject>(k,n));
}
}
通过这种方式,您将看到内存增加。
,您的地图填充函数会插入具有相同键1
的元素,这意味着它们只会插入1个元素,而忽略其余元素,而与len2
的值无关。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。