malloc和heap:用于存储大小和链表信息的额外内存?

flu*_*y03 4 c c++ memory heap malloc

我有一个关于heap和的简单问题malloc:

当我们使用malloc如下方式分配一些内存空间时:

int *p;
p = (int*) malloc (10*sizeof(int));
Run Code Online (Sandbox Code Playgroud)

它实际上在堆中分配了10个单词.但是,我的问题是:

实际使用的内存空间真的是10个字吗?

或者还有其他额外的空间来存储内存大小的值?

或者,甚至,因为堆被构造为链接列表,是否有其他内存空间用于存储指向堆中列表的下一个节点的地址?

wal*_*lyk 7

它完全取决于实现.

a)它可以在每个分配的节点之前有几个字节,其包含节点的大小,指向下一个节点的指针,以及可能是先前的节点指针和节点的类型.

b)除了其他分配之外,返回的项目可能没有任何其他内容.其他地方的结构可能通过位图或微型并行列表跟踪分配的内容和可用的内容.

c)另一种变化提供了几个固定大小的块阵列.一个阵列可以提供32字节的块; 另一个128字节的块等.每个阵列的位图管理分配.

d)我看到的最小的实现free()完全忽略了(也就是说,free()是一个无操作)并在每个实例中分配下一个池malloc().


到目前为止,最常用的现代技术是a.变体b用于许多文件系统,如NTFS和FAT.选项c在许多DEC操作系统中都很受欢迎,特别是对于内核使用.选项d由一些具有适当警告的极简主义嵌入式环境使用.

在大多数实现中,所请求的分配被四舍五入到方便算法的一些自然倍数(通常为2,8,16等).因此,5,3,8,7,4,1和15的一系列分配可以各自被视为16字节请求.

  • 值得注意的是,还有许多其他技巧可能会花费额外的空间,例如使用特殊位图填充来检测越界写入或有关分配的信息(代码的哪一部分进行了分配)以用于调试目的. (2认同)