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