我想测试当我请求24M内存时操作系统分配了多少.
for (i = 0; i < 1024*1024; i++)
ptr = (char *)malloc(24);
Run Code Online (Sandbox Code Playgroud)
当我这样写的时候,我从top命令中得到RES是32M .
ptr = (char *)malloc(24*1024*1024);
Run Code Online (Sandbox Code Playgroud)
但是当我做一点改变时,RES是244.它们之间有什么区别?为什么结果244?
分配器有自己的关于簿记的数据结构,也需要内存.当您以小块(第一种情况)进行分配时,分配器必须保留大量有关每个块分配位置以及长度的附加数据.此外,您可能会在块之间获得未使用内存的间隙,因为malloc需要返回足够对齐的块,最常见的是在8字节边界上.
在第二种情况下,分配器只为您提供一个连续的块,并仅为该块进行簿记.
始终要小心大量的小分配,因为簿记内存开销甚至可能超过数据本身的数量.
第二次分配几乎没有触及记忆.分配器告诉你"好吧,你可以拥有它",但如果你实际上没有触摸内存,操作系统实际上从未给你,希望你永远不会使用它.有点像庞氏骗局.另一方面,另一种方法将一些东西(最多几个字节)写入许多页面,因此操作系统被迫实际为您提供内存.
试试这个来验证,你应该使用大约24米:
memset(ptr, 1, 1024 * 1024 * 24);
Run Code Online (Sandbox Code Playgroud)
简而言之,top并没有告诉你你分配了多少,即你提出的问题malloc.它告诉您操作系统分配给您的进程.