问题描述
在下面的程序中,当我增加字符串列表的长度,即增加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
的值无关。