如何解决C中数组的内存使用情况
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语言的初学者,所以能帮助您。
解决方法
每次调用malloc
都会使用一些额外的“开销”内存,超出了您实际请求的数量。该库需要一些空间来跟踪这些块,以便以后知道如何free
,并且它可能会舍入alignment的少量分配。
您对char_array
本身的分配需要500000 * 8
,大约4兆字节的内存,并且开销可以忽略不计。因此,看来您的500000个分配(每个1个字节)实际上使用了大约32个字节。这不会太不寻常。例如,malloc
可能会将大小四舍五入为16个字节以进行对齐,然后需要额外的16个字节进行簿记(例如,每个大小为8个字节,并指向下一个块的指针以创建链接列表) )。
显然,这是分配500000个字符的空间的效率很低的方法。相反,您应该只创建500000
个char数组(而不是指针)并直接对其进行索引。
-
允许
-
malloc
以您希望的任何方式排列和“对齐”您分配的内存块,实际上每个块都有最小的分配大小和内部簿记开销。单字节分配(在您正在分配char
而不是char *
的循环内部)并不常见,因为这样做效率不高;实际上,您实际上可能实际上是在分配(至少)8个字节以及每个内部开销。 -
无论您要使用什么“物理内存”量度,都不能精确地映射到这里要寻找的内容。
malloc
通常从操作系统中获取内存池,然后将其分配到在程序级别看到的较小的已分配块(具有内部开销)。我不希望用户程序通过malloc
分配的字节与操作系统报告的有关进程的信息之间有任何确切的对应关系。也许所有其他条件都相等的方向相关性,却不值得花很多时间试图从中得出结论。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。