堆通常是如何实现的?

发布于 2024-10-04 00:29:36 字数 562 浏览 6 评论 0 原文

可能的重复:
堆和堆栈内存是如何管理、实现和分配的?

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

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

Possible Duplicate:
How is heap and stack memories managed, implemented, allocated?

Hi,
my question is about heap, not the data structure, but the area of memory that is used for dynamic memory allocation.

Suppose we're writing a program in C (or maybe C++) and somewhere in the depths of its code a call to malloc() is made (or operator new is invoked, in case of C++). Now what is the location of the allocated memory? Does the compiler (linker?) add a data segment that is used as a heap? How is the size of that segment determined? What will happen if we try to allocate a chunk of memory that is bigger than the entire "heap segment"? Will the heap be expanded? If yes, how?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

影子是时光的心 2024-10-11 00:29:36

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

The OS allocates pages, which it returns to malloc/free, which then break those pages up into blocks of the requested size, from memory. The OS can allocate any pages in the user's address space that aren't already requested. There is no heap segment. The allocated memory is in whatever location the OS determines.

无名指的心愿 2024-10-11 00:29:36

有 dlmalloc 内部工作原理的描述(glibc、uClibc 和许多其他地方使用的 malloc() 实现)此处

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

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

Windows API实际上类似于malloc()/free(),具有HeapAlloc()/HeapFree()等函数。

There is a description of the inner workings of dlmalloc (the malloc() implementation used on glibc, uClibc and many other places) here.

Unix-like OSes have two main interfaces for requesting/releasing memory:

  • brk() expands/shrinks the data segment.
  • mmap()/munmap() request/release additional memory mappings.

The Windows API is actually malloc()/free() like, with function like HeapAlloc()/HeapFree().

久而酒知 2024-10-11 00:29:36

旧的unix实现使用机制sbrk()——移动最后一个数据段边界的系统请求。当分配内存时,tuntime库调用系统将数据边界向上移动,并使用新来的内存。

新的操作系统使用虚拟内存,因此 malloc 在必要时向系统请求新的空闲 VM 页面。

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

Old unix implementations used mechanism sbrk()--system request for moving last data section boundary. When memory is allocated, tuntime library calls system to move data boundary up, and use newly coming memory.

New operational systems use virtual memory, so malloc requests new free VM pages from the system when necessary.

Standalone applications (which run on bare hardware, microcontrollers etc.) have all allocated memory. Library know about all memory because linker script defines symbols for dynamic area. E. g. something like freemembot and freememtop, for lowest and highest free memory area location.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文