在分配大型阵列时增加内存

时间:2014-02-13 20:48:33

标签: c++ c

将值分配给大型数组时,即使没有分配新内存,使用的内存也会不断增加。我只是通过任务管理器(Windows)或系统监视器(Ubuntu)来检查已用内存。

两个操作系统的问题都是一样的。我分别使用gcc 4.7或4.6。

这是我的代码:

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[]) {
    int i,j;
    int n=40000000;   //array size
    int s=100;
    double *array;

    array=malloc(n*sizeof(double));     //allocate array
    if(array==NULL){
        return -1;
    }

    for(i=0;i<n;i++){   //loop for array, memory increases during this loop
        for(j=0;j<s;j++){   //loop to slow down the program
            array[i] = 3.0;
        }
    }
    return 0;
}

我没有看到任何逻辑问题,但据我所知,我也没有超出任何系统限制。所以我的问题是:

  • 问题可以被其他人复制吗?

  • 记忆力增长的原因是什么?

  • 如何解决此问题?

2 个答案:

答案 0 :(得分:5)

当现代系统“分配”内存时,页面实际上并未在物理RAM中分配。您将获得虚拟内存分配。当您写入这些页面时,将采用物理页面。因此,当您执行malloc()时,所采用的虚拟RAM将会增加,但只有在您写入值时才会采用物理RAM(逐页)。

答案 1 :(得分:3)

您应该看到使用的虚拟内存会立即增加。之后,当您写入新分配的内存时,RSS或实际内存将会增加。有关更多信息,请访问How to measure actual memory usage of an application or process?

这是因为在您使用它之前,在Linux和许多其他操作系统上分配的内存实际上并没有提供给您的程序。

因此,您可以在256 MB计算机上使用malloc 1 GB,并且在实际尝试使用所有1 GB之前不会耗尽内存。

在Linux中,有一组过度使用设置会更改此行为。见Cent OS: How do I turn off or reduce memory overcommitment, and is it safe to do it?