dv_*_*dv_ 2 c malloc memory-management dynamic-memory-allocation static-memory-allocation
我想了解为什么动态分配多次调用的数据使用的内存比在代码上直接指定的内存或通过单次调用分配的那样多malloc.
例如,我在C中制作了以下两个代码:
test1.c:int x分配有malloc
int main (void)
{
int *x;
int i, n=1048576; //n=1024*1024;
printf("size = %lu\n", n* sizeof(int));
for(i=0; i<n; i++)
{
x = malloc(sizeof(int));
*x=i;
}
printf("Look at top and then press something to finish.");fflush(stdout);
getc(stdin);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我没有在这里免费使用它来保持简单.当程序等待交互时,我查看另一个终端中的top函数,它显示了这个:
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1384 root 20 0 41300 34076 1300 S 0.0 3.3 0:00.47 test1
Run Code Online (Sandbox Code Playgroud)
test2.c:int x未动态分配
int main (void)
{
int x[1048576]; //x[1024*1024]
int i, n=1048576;
printf("size = %lu\n", n* sizeof(int));
for(i=0; i<n; i++)
{
x[i]=i;
}
printf("Look at top and then press something to finish.");fflush(stdout);
getc(stdin);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
顶部告诉我:
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1352 root 20 0 12404 5500 1304 S 0.0 0.5 0:00.05 test2
Run Code Online (Sandbox Code Playgroud)
我还做了第三个代码,它与test2的结果相同,我使用的代码:
x = malloc(n*sizeof(int));
for(i=0; i<n; i++)
{
x[i]=i;
}
Run Code Online (Sandbox Code Playgroud)
为什么在进程的内存使用上有这么大的差异?那是因为malloc请求新的内存页面并且内存被浪费了吗?还是malloc分配更多内存?
test1使用总内存的3.3%,test2使用0.5%.
我正在docker内的Centos 5 64位上执行这些测试.
虚拟环境中的内存:
$ free -m
total used free shared buff/cache available
Mem: 995 98 845 3 51 808
Swap: 1162 194 967
Run Code Online (Sandbox Code Playgroud)
必须跟踪每个内存分配,以便free()释放空间以供重用.实际上,这意味着分配的内存大小最小; 对于32位程序,它可以是8或16个字节,对于64位程序,它可以是16-32个字节(取决于系统和正在使用的C库的版本).
当你分别分配一百万个整数时,每个整数使用8-32个字节,所以你实际上使用了8-32 MiB的内存.当您在堆栈中的单个阵列中分配一百万个整数时,您将使用4 MiB的内存.
因此,您会发现流程大小存在很大差异.
当然,第一个程序泄漏了几乎所有的内存,但这与您提出的问题相关.