[英]malloc and heap: extra memory for storing the size and linked list information?
我有一个关于heap
和malloc
的简单问题:
当我们使用malloc
分配一些内存空间时,如下所示:
int *p;
p = (int*) malloc (10*sizeof(int));
它实际上在堆中分配了 10 个字。 但是,我的问题是:
实际使用的内存空间真的是10个字吗?
或者还有其他额外的空间来存储内存大小的值?
或者,甚至,因为堆的结构是链表,是否有其他内存空间用于存储指向堆中列表下一个节点的地址?
它完全依赖于实现。
a) 在每个分配的节点之前可能有几个字节,其中包含节点的大小、指向下一个节点的指针,以及可能是前一个节点指针和节点的类型。
b) 除了其他分配之外,返回的项目可能没有其他任何东西。 其他地方的结构可能通过位图或微型并行列表跟踪已分配的内容和空闲的内容。
c) 另一种变体提供了几个固定大小块的数组。 一个数组可以提供 32 字节的块; 另一个 128 字节的块等。每个数组的位图管理分配。
d) 我见过的最简单的实现完全忽略了free()
(也就是说, free()
是一个无操作)并在每个malloc()
分配池的下一部分。
到目前为止,最常用的现代技术是一个。 变体b用于许多文件系统,如 NTFS 和 FAT。 选项c在许多 DEC 操作系统中曾经/受到青睐,尤其是对于内核使用。 选项d被一些带有适当警告的极简嵌入式环境使用。
在大多数实现中,请求的分配被四舍五入到算法方便的某个自然倍数(通常是 2、8、16 等)。 因此,一系列 5、3、8、7、4、1 和 15 的分配可能每个都被视为一个 16 字节的请求。
内存分配取决于编译器库和操作系统。
两种语言都没有规定可以分配的最大内存量。 您所保证的只是所要求的尺寸。
因此,如果分配了任何额外的内存,它将取决于平台。
此外,分配更大的空间时可能会有更少的开销。
尝试编写自己的内存分配器,看看需要什么,尤其是在处理内存时。
是的, malloc
的实现可能实际分配的内存比您请求的多一点,在分配的内存的开头存储分配的内存的大小,然后给您一个指向下一个内存地址的指针。 当您对该指针调用free
时,分配器将返回一点,读取缓冲区的大小,并计算出实际需要释放多少。
但是当然,另一种可能的实现可以保留一个列表或一个字典,或者在幕后做一些完全不同的事情,只要它给你相同的指定行为。
当您使用malloc
分配内存时,您得到的只是一个指向该内存中第一个地址的指针,并保证分配了这么多字节供您使用。 如何分配和跟踪内存的详细信息取决于平台,您无法从程序内部访问该信息。 因此,虽然可能会出于开销目的分配额外的内存,但您不能以跨平台的方式使用该知识。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.