C - 预测简单应用程序的运行时ram使用情况

时间:2014-05-18 05:24:21

标签: c arrays malloc ram

假设我有以下程序 - 从命令行取一个数字(例如10M),创建一个这个大小的数组,用随机整数填充它,挂起15秒然后退出。应该占用多少内存? (给出10M的输入)

#include <stdio.h>
#include <string.h>
#include <time.h>
#include <stdlib.h>
#include <unistd.h>

int main(int argc, char **argv)
{
  printf("running\n");
  long long size = atoi(argv[1]);
  printf("%lld\n", size);
  int *myArray = malloc(size * sizeof *myArray);
  printf("allocated array\n");
  srand(time(NULL));
  for (long long i=0;i<size;i++) {
    if (i == 0) {
      printf("first iteration\n");
    }
    int r = rand();
    myArray[i] = r;
  }
  printf("Allocated\n");
  sleep(15);
  printf("Done\n");
}

给出输入

./a.out 10000000

这(在Mac活动监视器中)占用38.4M。

我的问题是:有没有办法在给定这些参数的情况下预测简单C应用程序的RAM使用情况?即10M整数数组。

3 个答案:

答案 0 :(得分:2)

您的系统上似乎有32位(4字节)整数。

1000万个整数需要1000万* 4 = 4000万字节。

4000万字节= 40000000/1024/1024 = 38.15MB,接近你所看到的。

答案 1 :(得分:0)

由于多种因素(包括内存中代码的大小以及对齐),你无法预测正好,但对于这个简单的应用程序,你可以非常接近,正如Joachim的回答所指出的那样

答案 2 :(得分:0)

假设一台32位计算机,每个int需要4个字节,因此10M整数的数组将为您要分配的阵列使用大约40 MB。此外,它还使用内存作为程序本身的代码,以及与之链接的所有库。

但是,这都是虚拟内存。它使用的RAM量取决于它所做的事情。如果它分配一个数组但从不使用它,则该数组可能永远不会被加载到RAM中。或者在使用它之后,某些部分可能被分页,因此数组可能永远不会同时存在于内存中。虚拟内存在实际RAM使用中的反映方式很难预测,如果系统上有足够的内容可以将每个程序的内存同时保存在RAM中