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的值无关。