【问题标题】:C - predicting runtime ram usage for a simple applicationC - 预测简单应用程序的运行时内存使用情况
【发布时间】:2014-05-18 05:24:20
【问题描述】:

假设我有以下程序 - 从命令行获取一个数字(例如 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 整数的数组。

【问题讨论】:

  • 我认为这个等式应该显示大约 99% 的内存(以字节为单位)。 size * sizeof *myArray
  • P.S.> 在 myArray 初始化之前你怎么能做到sizeof *myArray?没有意义。
  • 你要找的是malloc(size * sizeof(int));
  • @SSpoke sizeof 的这种使用是合法且推荐的:stackoverflow.com/q/373252/509868
  • @anatolyg 我猜它可以工作,因为 malloc asm 是在 myArray 之后执行的?还是不好看。

标签: c arrays malloc ram


【解决方案1】:

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

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

4000 万字节 = 40000000/1024/1024 = 38.15MB,与您看到的差不多。

【讨论】:

    【解决方案2】:

    由于多种因素,包括内存中代码的大小以及对齐方式,您无法精确地预测它,但是对于这个简单的应用程序,您可以非常接近,正如 Joachim 的回答所指出的那样.

    【讨论】:

      【解决方案3】:

      假设一台 32 位机器,每个 int 占用 4 个字节,因此 10M 个整数的数组将为您分配的数组使用大约 40 MB。此外,它使用内存存储程序本身的代码,以及它链接的所有库。

      然而,这都是虚拟内存。它使用的 RAM 量取决于它在做什么。如果它分配了一个数组但从不使用它,则该数组可能永远不会加载到 RAM 中。或者在使用它之后,某些部分可能会被调出,因此数组可能永远不会一次全部在内存中。虚拟内存反映在实际 RAM 使用中的方式可能很难预测,如果您的系统上发生的事情足够多,以至于无法同时将每个程序的内存保留在 RAM 中。

      【讨论】:

        猜你喜欢
        • 2010-10-02
        • 2012-11-12
        • 1970-01-01
        • 2011-09-20
        • 1970-01-01
        • 2013-05-11
        • 1970-01-01
        • 1970-01-01
        • 2016-02-05
        相关资源
        最近更新 更多