【问题标题】:How malloc allocates memory less than 4KB?malloc如何分配小于4KB的内存?
【发布时间】:2014-02-20 01:38:14
【问题描述】:

如果 malloc 调用 VirtualAlloc() 函数分配内存(分配最小 4Kb),malloc 如何为 int 分配 4 个字节?

【问题讨论】:

  • 您如何确定 malloc 为 int 分配了 2 个字节?如果你要求 sizeof(int) 它可能已经分配了 4kb 并且你不会更聪明。
  • std::cout
  • 修复它... int 通常有 4 个字节而不是 2 个字节,但问题很好。
  • 这可能很有趣:en.wikipedia.org/wiki/…
  • 如果您有可用的 K&R,那么它显示了一种实现 malloc() 等的方法。从根本上说,malloc() 将有关它已分配并提供给程序员的块大小的信息保存在某处;通常,它就在malloc() 给出的指针之前。 malloc() 总是将分配四舍五入到一个方便的大小(供它使用);这通常是 32 位系统的 8 字节的倍数和 64 位系统的 16 字节的倍数。

标签: c++ c malloc virtualalloc


【解决方案1】:

mallocpage size 的倍数从操作系统请求内存(显然,因为页面大小是根据定义分配的内存量)并将其以较小的块分发给您。

这与所有内存分配器所做的没有什么不同——事实上,在幕后使用malloc 的专用内存分配器(例如Boost.Pool)再次这样做:它们通过@987654326 分配更大的内存块@ 并把它分成小块交给你。

【讨论】:

  • +1 通常也称为子分配器。许多(我敢说大多数)运行时库为您做了这些事情(或者至少它们曾经在内存宝贵时使用过)。
【解决方案2】:

我正在开发的应用程序在内部使用 Doug Lea (ftp://g.oswego.edu/pub/misc/malloc.c) 的 malloc.c 实现,它在许多平台上广泛使用。

如果 Windows 使用 VirtualAlloc 保留和提交 64KB 块,此实现会从系统中获取内存。然后它使用各种算法和结构来尽可能高效地使用这块内存。

我测试了 2 个字节的分配,从调试器中我看到它首先将其填充到 4 个字节,然后将其放入 SmallBins - 这是一种处理小内存分配的方法。最后我看到这个分配的实际内存使用量是 16 字节。但这可能取决于平台。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-26
    • 1970-01-01
    • 2013-02-23
    • 2015-09-21
    • 2012-07-28
    • 2017-04-14
    • 2020-12-14
    相关资源
    最近更新 更多