堆通常如何实现?

时间:2010-11-20 09:57:22

标签: c++ c memory heap low-level

  

可能重复:
  How is heap and stack memories managed, implemented, allocated?

您好, 我的问题是关于堆,而不是数据结构,而是用于动态内存分配的内存区域。

假设我们正在用C(或者C ++)编写一个程序,并且在其代码深处的某个地方调用malloc()(或者在C ++的情况下调用operator new)。现在分配内存的位置是什么?编译器(链接器?)是否添加了用作堆的数据段?该部分的规模如何确定?如果我们尝试分配一块比整个“堆段”更大的内存,会发生什么?堆扩展了吗?如果是,怎么样?

3 个答案:

答案 0 :(得分:3)

操作系统分配页面,然后返回到malloc / free,然后从内存中将这些页面分解为所请求大小的块。操作系统可以在用户的​​地址空间中分配尚未请求的任何页面。没有堆段。分配的内存位于操作系统确定的任何位置。

答案 1 :(得分:0)

旧的unix实现使用机制sbrk() - 移动最后数据部分边界的系统请求。分配内存时,tuntime库会调用system来向上移动数据边界,并使用新的内存。

新的操作系统使用虚拟内存,因此malloc会在必要时从系统中请求新的免费VM页面。

独立应用程序(在裸硬件,微控制器等上运行)都已分配内存。库知道所有内存,因为链接器脚本定义了动态区域的符号。 E. g。类似freemembotfreememtop的内容,用于最低和最高可用内存区域位置。

答案 2 :(得分:0)

描述了dlmalloc的内部工作原理(glibc,uClibc和许多其他地方使用的malloc()实现)here

类似Unix的操作系统有两个用于请求/释放内存的主要接口:

  • brk()扩展/缩小数据段。
  • mmap()/ munmap()请求/释放额外的内存映射。

Windows API实际上是malloc()/ free()之类,其功能类似于HeapAlloc()/ HeapFree()。​​