已经分配了一些内存,我无法计算出我分配的内存的正确大小。系统告诉我,我已经分配了2GB,但是我的代码告诉我我刚刚分配了119 MB。我不知道这是什么错误的。
#include <stdio.h>
#include <stdlib.h>
int main(void){
long long size = 0;
while(malloc(1) != NULL){
size = size + 1;
}
long long res = size>>20;
printf("%d MBytes\n",res);
scanf("%d",&size);
return 0;
}
答案 0 :(得分:4)
malloc
和free
的代码必须维护数据结构,以跟踪给定的每个内存块。假设malloc
返回的每个内存块都有一个16字节的数据结构。您说您分配了119 MB,因为分配了1字节的块,这表明您有124780544个块。如果每个块具有16个字节的开销,则124780544 x 16 = 1996488704字节的开销。 124780544 + 1996488704 = 2121269248,或恰好大约2 GB。
(这不能证明,实际上您的系统为每个返回的块使用了恰好16个字节的开销,这可能比这要复杂得多,但是结果肯定是暗示性的)
道德是分配大量的微小内存块是非常浪费的。
如果更改测试程序以一次分配1k的块,则可能会得到更可口的结果。