这个练习要求我看看如果在下面的程序中分配的内存块小于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共计
我自己修改的程序正确吗?为什么结果小于3056 is?
发布于 2014-06-05 05:12:47
free时,您不会告诉它您正在释放的块有多大。这意味着内存管理系统必须知道每个块有多大。这意味着它必须将这些信息存储在某个地方。因为它不能在内存块中存储信息,所以它必须将它存储在块之外,这通常意味着实际分配的内存比请求的要多一些。例如,它实际上可以分配一个比请求的块大一个size_t的块,在开始时存储块大小,然后告诉您该块是在大小之后开始的。大多数malloc实现都会在页面边界上进行大量的分配(通常一个页面是4K)。一种方法是为每个分配浪费整个页面,只对单个size_t值使用该页面。这听起来很糟糕,但如果你想要半兆字节,一页不到分配大小的1%,浪费1%的总内存也没那么可怕。
假设是你的马洛干的。当您分配1MB块时,您将设法分配其中的3056个。如果每个分配比请求大一个4k页,隐藏分配将为3056*4k,或略小于12 is。(实际上它略小于12 兆字节,但我要继续说mega,我的意思是mebi。)所以可用的总内存应该是3068 MB。
当您将其更改为分配半MB块时,您至少可以分配其中的3045*2-1块(假设MB的数量被舍入)。这是6089个额外页面,约为23.8MB,再加上3044.5 MB的分配,总共约为3068.3 MB。
所有这些都不能证明您的malloc是这样工作的,但它至少显示了一种可能的机制。
发布于 2014-06-05 05:23:20
1.当你运行这个程序时,你不会每次都得到相同的结果。因为您正在从堆中分配1MB的内存块,直到内存可用为止,并且可用内存在perticular中可能会有所不同。
2.你的代码中没有任何错误。
3.在分配内存后,没有分配内存,因此一般操作系统释放了程序exists.This后分配的内存,而嵌入式操作系统一般不为您释放内存。
https://stackoverflow.com/questions/24051827
复制相似问题