我对heap
和malloc
:
当我们使用malloc
分配一些内存空间时如下:
int *p;
p = (int*) malloc (10*sizeof(int));
它实际上在堆中分配了10个单词。但是,我的问题是:
实际使用的内存空间真的是10个字吗?
或者存储内存大小值还需要其他额外空间吗?
或者,甚至,因为堆的结构为 Linked list ,是否有其他内存空间用于存储指向堆中列表的下一个节点的地址?
答案 0 :(得分:7)
完全取决于实现。
a)在每个分配的节点之前可能有几个字节,其中包含节点的大小,指向下一个节点的指针,以及可能是前一个节点指针和节点类型。
b)除了其他分配之外,返回的项目可能没有任何其他内容。其他地方的结构可能通过位图或微型并行列表跟踪分配的内容和空闲内容。
c)另一种变体提供了几个固定大小的块阵列。一个阵列可以提供32字节的块;另一个128字节的块等。每个阵列的位图管理分配。 d)我见过的最小的实现完全忽略free()
(即free()
是一个无操作)并在每个malloc()
分配池的下一部分。< / p>
到目前为止,最常用的现代技术是 a 。 Variant b 用于许多文件系统,如NTFS和FAT。选项 c 在许多DEC操作系统中都很受欢迎,特别是对于内核使用。选项 d 由一些极简主义的嵌入式环境使用,并有适当的警告。
在大多数实现中,所请求的分配被四舍五入到方便算法的一些自然倍数(通常为2,8,16等)。因此,5,3,8,7,4,1和15的一系列分配可能都被视为16字节请求。
答案 1 :(得分:2)
内存分配取决于编译器库和操作系统。
两种语言都没有说明可以分配的最大内存量。所有保证都是要求的尺寸。
因此,如果分配了任何额外的内存,它将取决于平台。
此外,分配更大的空间时可能会减少开销。
尝试编写自己的内存分配器,看看需要什么,尤其是在废弃内存时。
答案 2 :(得分:1)
是的,malloc
的实现可能实际分配比你请求的内存多一点的内存,在分配的内存的开头存储分配的内存的大小,然后给你一个指针紧邻的下一个内存地址。当你在该指针上调用free
时,分配器将返回一点,读取缓冲区的大小,并计算实际释放所需的量。
但是,当然,另一种可能的实现可以保留列表或字典,或者做一些完全不同的事情,只要它给你相同的指定行为。
答案 3 :(得分:1)
当你使用malloc
分配内存时,所得到的只是指向该内存中第一个地址的指针,并保证为你的使用分配了这么多字节。分配和跟踪内存的如何的详细信息取决于平台,并且您无法从程序中访问该信息。因此,虽然可以为开销目的分配额外的内存,但是不能以跨平台的方式使用这些知识。