【发布时间】:2021-07-13 00:35:58
【问题描述】:
我有以下程序:
int main(int argc,char **argv){
double*a;
double*b;
double*c;
double*d;
double*e;
double*f;
double*g;
double*h;
double*i;
double*j;
double*k;
double*l;
double*m;
double*n;
double*o;
double*p;
double*q;
while(1){
a=malloc(1000000*1000000000000*sizeof(double));
b=malloc(1000000*1000000000000);
c=malloc(1000000*1000000000000);
d=malloc(1000000*1000000000000);
e=malloc(1000000*1000000000000);
f=malloc(1000000*1000000000000);
g=malloc(1000000*1000000000000);
h=malloc(1000000*1000000000000);
i=malloc(1000000*1000000000000);
j=malloc(1000000*1000000000000);
m=malloc(1000000*1000000000000);
n=malloc(1000000*1000000000000);
o=malloc(1000000*1000000000000);
p=malloc(1000000*1000000000000);
q=malloc(1000000*1000000000000);
}
}
任务管理器发出以下内存使用情况:
然后,我将程序更改为
int main(int argc,char **argv){
double*a;
while(1){
a=malloc(1000000*1000000000000*sizeof(double));
}
}
编译,任务管理器显示:
第一个程序的内存使用率不应该更高吗?我在这里错过了什么?
【问题讨论】:
-
您对
malloc的调用可能会失败(您在每个malloc处都请求大量内存)。一些操作系统有memory overcommitment。典型的笔记本电脑和操作系统可以拥有processes,每个都使用几千兆字节!阅读dynamic memory management的文档,并使用valgrind -
就是这样,谢谢!
-
某些操作系统可以在
malloc()上返回一个有效指针,但在您访问它之前不会真正占用空间。我曾经尝试malloc(),直到它返回NULL,它给了我比可用内存更多的内存。经验教训:这样的基准并非微不足道。 -
我会打印出指针。很有可能它们都是空指针,因为您的计算机没有一百万 TB 作为虚拟内存的后备存储。