已经分配了一些内存,我无法计算出我分配的内存的正确大小。我不知道为什么

时间:2018-11-02 13:20:22

标签: c malloc long-integer

已经分配了一些内存,我无法计算出我分配的内存的正确大小。系统告诉我,我已经分配了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;
}

image_res_1 image_res_2

1 个答案:

答案 0 :(得分:4)

mallocfree的代码必须维护数据结构,以跟踪给定的每个内存块。假设malloc返回的每个内存块都有一个16字节的数据结构。您说您分配了119 MB,因为分配了1字节的块,这表明您有124780544个块。如果每个块具有16个字节的开销,则124780544 x 16 = 1996488704字节的开销。 124780544 + 1996488704 = 2121269248,或恰好大约2 GB。

(这不能证明,实际上您的系统为每个返回的块使用了恰好16个字节的开销,这可能比这要复杂得多,但是结果肯定是暗示性的)

道德是分配大量的微小内存块是非常浪费的。

如果更改测试程序以一次分配1k的块,则可能会得到更可口的结果。