练习要求我查看如果在以下程序中要分配的内存块小于1MB,会发生什么情况:
#include <stdio.h>
#include <stdlib.h>
main()
{
int MB=0;
while(malloc(1<<20))
++MB;
printf("Allocated %d MB total\n",MB);
}
我的笔记本电脑上的结果是
总共分配了3056 MB
比我这样更改程序:
#include <stdio.h>
#include <stdlib.h>
main()
{
int MB=0;
while(malloc(1<<19))
++MB;
printf("Allocated %d MB total\n",MB/2+MB%2);
}
结果是
总共分配了3045 MB
我自己更改的程序是否正确?为什么结果小于3056MB?
是的,您的程序很好。(尽管总是将兆字节的数量四舍五入有点不合标准。)
呼叫时free
,您不会告诉它要释放的块有多大。这意味着内存管理系统必须知道每个块有多大。这意味着它必须将该信息存储在某个地方。由于它无法将信息存储在内存块内部,因此必须将其存储在内存块外部,这通常意味着实际上分配的内存比请求的要多。例如,它实际上可以分配一个size_t
比请求的块大一个的块,将块的大小存储在开头,然后告诉您该块在size之后开始。
大多数malloc
实现都会在页面边界上放置大量分配(通常页面为4K)。一种方法是浪费每个分配的整个页面,仅将页面用于单个size_t值。这似乎很糟糕,但是如果您只要求半个兆字节,那么页面的大小不到分配大小的1%,浪费总内存的1%并不是那么糟糕。
假设您的malloc做到了。分配1MB块时,您设法分配了3056个块。如果每个分配比请求大4k页,则隐藏分配将为3056 * 4k,或略小于12兆字节。(实际上,它略小于12兆字节,但我要说的是mebi时,我只会继续说兆。)因此,可用的总内存为3068 MB。
当您将其更改为分配½MB块时,您将设法分配至少3045 * 2-1-的1个块(假设MB的数量已四舍五入)。那就是6089个额外的页面,大约23.8 MB,再加上3044.5 MB的分配,总共约3068.3 MB。
这些都不能证明您的malloc可以那样工作,但是至少表明了一种可能的机制。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句