gpt4 book ai didi

c - 内存分配和进程内存使用

转载 作者:行者123 更新时间:2023-12-05 01:01:55 26 4
gpt4 key购买 nike

我想了解为什么多次调用动态分配的数据使用的内存比直接在代码上指定的内存或通过 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;
}

为了简单起见,我没有在此处使用 free。当程序等待交互时,我在另一个终端中查看顶部函数,它显示给我:

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

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;
}

顶部显示我:

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

我还做了第三个代码,结果与我使用的 test2 相同:

x = malloc(n*sizeof(int));
for(i=0; i<n; i++)
{
x[i]=i;
}

为什么进程的内存使用差异如此之大?那是因为 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

最佳答案

必须跟踪每个内存分配,以便 free() 可以释放空间以供重用。实际上,这意味着分配了最小内存大小; 32 位程序可以是 8 或 16 字节,64 位程序可以是 16-32 字节(取决于系统和使用的 C 库版本)。

当您分别分配一百万个整数时,每个整数使用 8-32 字节,因此您实际上使用了 8-32 MiB 的内存。当您在堆栈上的单个数组中分配一百万个整数时,您正在使用 4 MiB 的内存。

因此您会看到进程大小存在很大差异。

当然,第一个程序几乎泄漏了所有内存,但这与您提出的问题无关。

关于c - 内存分配和进程内存使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38493155/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com