【问题标题】:Memory usage by map structure in c++ programc++程序中map结构的内存使用情况
【发布时间】:2020-10-21 09:24:08
【问题描述】:

在我下面的程序中,当我增加字符串列表的长度,即增加 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,int j, map<int,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,len2,m1);
    cout << "Hello world!" << endl;
    getchar();
    return 0;
}

void fillMemory(int i,int j, map<int,int> m){

        for(int k=i; k< j; k++){
            m.insert(pair<int,int>(i,k));
        }


    }

void fillMoreMemory(int i,int j, map<int,NewObject> m1){

        for(int k=i; k< j; k++){
            NewObject n;
            m1.insert(pair<int,NewObject>(i,n));
        }


    }

【问题讨论】:

  • 您将映射按值传递给这些函数,除了内存使用情况外,没有可观察到的行为。优化的构建可能不会向地图中插入任何内容
  • 你打开编译器优化了吗?
  • 我认为问题在于我的密钥设置为 1。我会回去检查一下。谢谢。

标签: c++ memory memory-management std stdmap


【解决方案1】:

您在函数中按值传递映射,因此从 main 的角度来看,当函数退出时,所有更改都将被丢弃。

现在,如果您进行一些优化编译,可能程序永远不会在地图中插入元素。为避免这种情况,请尝试使用插入函数内部的地图元素,并在函数执行时查看结果。

但是当函数退出时,你看不到比启动函数时更多的内存。

除此之外,您还曾使用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,int j, map<int,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,len2,m1);
    cout << "Hello world!" << endl;
    getchar();
    return 0;
}

void fillMemory(int i,int j, map<int,int>& m){

        for(int k=i; k< j; k++){
            m.insert(pair<int,int>(k,k));
        } 

    }

void fillMoreMemory(int i,int j, map<int,NewObject>& m1){

        for(int k=i; k< j; k++){
            NewObject n;
            m1.insert(pair<int,NewObject>(k,n));
        }       
    }

这样你会看到内存增加了。

【讨论】:

    【解决方案2】:

    您的地图填充函数插入具有相同键 1 的元素,这意味着它们只插入 1 个元素并丢弃其余元素,而不管 len2 的值如何。

    【讨论】:

    • 及时帮助!所以我认为问题是由于“m1.insert(pair(i,n));”行引起的?谢谢!