gpt4 book ai didi

c++ - 动态内存分配和内存块元数据

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:52:56 27 4
gpt4 key购买 nike

我对动态内存分配的底层内容有疑问。我知道可能会有不同的实现,但我需要了解基本思想。

所以,

当现代操作系统内存分配器或等效分配内存块时,需要释放该 block 。

但是,在此之前,需要存在一些系统来控制分配过程。

我需要知道:

  • 该系统如何跟踪已分配和未分配的内存。我的意思是,系统需要知道已经分配了哪些 block 以及它们的大小,以便在分配和释放过程中使用此信息。

现代硬件是否支持此过程,例如分配位或类似的东西?或者是某种用于存储分配信息的数据结构。如果有一个数据结构,与分配的内存相比,它使用了多少内存?

大块分配内存比小块分配内存更好吗?为什么?

感谢任何有助于揭示基本实现细节的答案。

如果需要代码示例,C 或 C++ 就可以了。

最佳答案

“该系统如何跟踪已分配和未分配的内存。”对于带有操作系统的非嵌入式系统,一个 virtual page table ,操作系统负责组织(当然有硬件 TLB 支持),跟踪程序的内存使用情况。

据我所知(如果我弄错了,社区肯定会对我大吼大叫), 跟踪个人 malloc() sizes and locations 有很多实现,并且依赖于运行时库。一般来说,无论何时调用 malloc(),大小和位置都存储在一个表中。每当您调用 free() 时,都会查找所提供指针的表条目。如果找到,则删除该条目。如果未找到,则忽略 free()(这也表明可能存在内存泄漏)。

当虚拟页面中的所有 malloc() 条目都被释放时,该虚拟页面就会被释放回操作系统(这也意味着 free() 不会始终将内存释放回操作系统,因为虚拟页面中可能仍有其他 malloc() 条目)。如果给定虚拟页面中没有足够的空间来支持指定大小的另一个 malloc(),则从操作系统请求另一个虚拟页面。

嵌入式处理器通常没有操作系统、虚拟页表,也没有多进程。在这种情况下,不使用虚拟内存。相反,嵌入式处理器的整个内存被视为一个大的虚拟页面(尽管地址实际上是物理地址)并且内存管理遵循与之前描述的类似过程。

Here是一个类似的堆栈溢出问题,有更深入的答案。

“大块分配内存比小块分配内存更好吗?为什么?”根据需要分配尽可能多的内存,不多也不少。编译器优化非常聪明,而且几乎总是比程序员手动管理内存更有效(即减少内存碎片)。在非嵌入式环境中尤其如此。

Here是一个类似的堆栈溢出问题,具有更深入的答案(请注意,它属于 C 而不是 C++,但它仍然与此讨论相关)。

关于c++ - 动态内存分配和内存块元数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16901946/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com