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;
}
我有上面的一段代码。我不明白19532KB的内存使用是从哪里来的。在我的机器(64位(中,sizeof(char*)
应该是8个字节。对于数组的行初始化,如何使用内存?我是C语言的初学者,如果有任何帮助,我将不胜感激。
每次对malloc
的调用都会使用一些额外的"开销";内存超出了您实际要求的数量。库需要一些空间来跟踪这些块,以便以后知道如何free
它们,并且它可能会将小分配的大小四舍五入以进行对齐。
char_array
本身的分配需要500000 * 8
,大约4兆字节的内存,并且开销可能可以忽略不计。因此,看起来500000个分配(每个分配1个字节(实际上每个分配使用了大约32个字节。这并不罕见;例如,malloc
可能需要将大小四舍五入到16个字节以进行对齐,然后需要额外的16个字节用于记账(例如,一个大小和指向下一个块的指针各8个字节以形成链表(。
显然,这是一种为500000个字符分配空间的非常低效的方式。相反,您应该只创建一个500000
字符数组(而不是指针(,并直接对其进行索引。
-
malloc
被允许排列并且"对齐";您可以按照自己的意愿分配内存块,在实践中,每个块都有最小的分配大小和内部记账开销。单字节分配(在循环中分配char
s,而不是char *
s(并不常见,因为这样做效率很低;在实践中,您可能实际分配(至少(8个字节加上内部开销。 -
无论";物理存储器";您正在查看的度量并不能准确地映射到您在这里要查找的内容。
malloc
通常从操作系统获取内存池,然后将其分配到您在程序级别看到的较小的已分配块(带有内部开销(中。我不希望用户程序通过malloc
分配的字节与操作系统报告的进程之间有任何确切的对应关系。也许这是一种方向相关性,它使所有其他因素都相等,但不值得花太多时间来推断结论。