【问题标题】:Memory usage by arrays in CC中数组的内存使用情况
【发布时间】:2020-12-19 01:37:02
【问题描述】:
int main() {
    int i = 0, ARRAY_SIZE = 500000;
    char **char_array;  
    
    char_array = (char **)malloc(ARRAY_SIZE * sizeof(char*));
    //physical memory used before loop = M KB
    for (i = 0; i < ARRAY_SIZE; i++) {
        char_array[i] = (char *)malloc(16 * sizeof(char));
    }
    //physical memory usage after loop = M+19532 KB 
    return 0;
}

我有上面的代码。我不明白 19532 KB 的内存使用量是从哪里来的。在我的机器(64 位)中,sizeof(char*) 应该是 8 个字节。对于数组的行初始化,内存是如何使用的?我是 C 的初学者,所以任何帮助将不胜感激。

【问题讨论】:

  • 是的,你是对的。 500000 × 8 字节 = 4 兆字节。你是如何测量内存的?
  • 通常有一个最小分配大小,如果你请求一个小于最小值的小块,你会得到最小值。

标签: c pointers memory char malloc


【解决方案1】:

每次调用malloc 都会使用超出您实际请求量的额外“开销”内存。库需要一些空间来跟踪这些块,以便以后知道如何free 它们,并且它可能会为alignment 向上舍入小分配的大小。

您分配的char_array 本身需要500000 * 8,大约4 兆字节的内存,开销可能可以忽略不计。所以看起来你的 500000 个 1 字节分配实际上每个使用大约 32 个字节。这不会太不寻常。例如,malloc 可能会将大小四舍五入到 16 个字节以进行对齐,然后需要额外的 16 个字节进行簿记(例如,每个大小需要 8 个字节和指向下一个块的指针以创建链表)。

显然,这是为 500000 个字符分配空间的一种非常低效的方法。相反,您应该只创建一个 500000 char(不是指针)数组并直接对其进行索引。

【讨论】:

    【解决方案2】:
    1. malloc 被允许以任何它想要的方式排列和“对齐”你分配的内存块,实际上每个块都有最小分配大小和内部簿记开销。单字节分配(在循环内分配chars 而不是char *s)并不常见,因为这样做效率低下;在实践中,您可能实际上分配(至少)8 个字节加上内部开销,每个。

    2. 您正在查看的任何“物理内存”度量都不能精确地映射到您在此处查找的内容。 malloc 通常从操作系统获取内存池,然后将其分配到您在程序级别看到的较小的已分配块(具有内部开销)中。我不希望用户程序通过malloc 分配的字节与操作系统报告的进程之间有任何确切的对应关系。也许是一个方向相关性使所有其他条件都相同,但不值得花很多时间试图从中推断出结论。

    【讨论】:

      猜你喜欢
      • 2015-12-08
      • 2010-10-19
      • 2013-08-13
      • 1970-01-01
      • 2012-08-17
      • 1970-01-01
      • 2012-07-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多