首页 > 解决方案 > 分配了一些内存后,我无法计算我分配的内存的正确大小。我不知道为什么

问题描述

分配了一些内存后,我无法计算我分配的内存的正确大小。系统告诉我我已经分配了 2GBytes,但我的代码告诉我我刚刚分配了 119 MBytes。我不知道出了什么问题。

#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

标签: cmalloclong-integer

解决方案


代码必须维护数据结构mallocfree跟踪它给你的每个内存块。让我们假设每块内存返回一个 16 字节的数据结构malloc。你说你分配了 119 MB,因为你分配了 1 字节块,这表明你有 124780544 个块。如果每个块有 16 字节的开销,那就是 124780544 x 16 = 1996488704 字节的开销。124780544 + 1996488704 = 2121269248,或者正好是 2 GB。

(这并不能证明您的系统实际上为每个返回的块使用了 16 个字节的开销——它可能比这更复杂——但结果肯定是有启发性的。)

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

如果您将测试程序更改为一次分​​配 1k 块,您可能会得到更令人满意的结果。


推荐阅读