【问题标题】:Is there a minimal Heap Size是否有最小堆大小
【发布时间】:2017-04-11 20:58:13
【问题描述】:

我在一台 32 位的旧机器上。并想深入了解事情的进展情况。这个系统上的堆实现真的很旧,我认为它使用的是旧的 malloc 算法。 现在我的问题是。 这是我的程序。

#include <stdio.h>
#include <stdlib.h>

struct fp {

 int (*fpd)();
};

int main() 
{
    int *ptr;
    malloc(sizeof(struct fp));
    printf("Size:%d\n",sizeof(struct fp));
    return 0;
}  

如果我运行程序,输出为 4。 所以堆块大小应该是 4byte header + 4byte size + 4byte(sizeof struct) 所以堆应该是12字节等于0xc

但是如果我查看 gdb 中的堆,它会告诉我一块 0x10 的大小 等于 16 个字节,但其他 4 个字节来自哪里。这让我很困惑!

或者是否存在最小块大小为 0x10?

【问题讨论】:

  • malloc 实现细节不受任何标准的约束。打开它的源代码,看看它对你来说真的很重要。
  • malloc() 有可能完全获得 16 字节(或更大)块的内存。在这种情况下,很可能存在比您想象的更多的开销,或者只是从操作系统获得的空间比您请求的更多。并不是说任何这样的额外空间都可以安全使用——malloc() 可能会使用它来满足未来的一些请求,而无需从操作系统获得任何额外的内存。
  • 如何获取我的 malloc 源代码? @Eugene Sh.
  • 堆分配完全有可能(并且相当常规)四舍五入到(例如)2 的下一个幂。
  • 这些关于 malloc 使用标头或大小的假设在哪里?你在什么系统上,他们为什么不使用 mmu 表,为什么有一组单独的参数等?为什么不是最小尺寸 4096 或 8192?研究它的工作原理是有价值的。所以去做吧......如果你不知道如何/在哪里,那么你还没有准备好去做那件事,研究图书馆是如何工作的以及系统调用是如何工作的。

标签: c++ c


【解决方案1】:

是否有最小堆大小 (?)

听起来 OP 想知道最小分配大小,而不是“堆”的总大小。


所有*alloc(),当成功返回非NULL(**见下文)时,“产生一个指向与任何其他对象不相交的对象的指针。” C11 §7.22.3 1.

所有这些指针都满足基本对齐要求。

基本对齐是“等于_Alignof(max_align_t)”§6.2.8 2

所以sizeof(max_align_t)(示例 4)是“堆”分配的下限最小值,所有分配也将是 4 的倍数。

通常,每次分配都会产生开销,有时只有 1 个sizeof(max_align_t)。在我们的示例系统中,下限为 8。

是否有可能存在最小块大小为 0x10?

是的。出于性能原因或最小化碎片,分配可能会进一步将最小大小限制为某个下限,例如 16。@ John Bollinger

绝对较低的分配大小因平台而异。除了满足基本对齐的约束之外,它没有被 C 指定。


** 详情:malloc(0) 可以成功返回NULL,所以可以说在这种病态的情况下,最小分配大小为 0。

【讨论】:

  • 6.2.8 2 没有将基本对齐定义为等于_Alignof(max_align_t)。它提到实现支持的最大对齐等于那个。 A(不是the)基本对齐小于或等于那个。基本对齐是每种类型的; charintdouble 每个都有自己的基本对齐方式。所以我不确定 7.22.3 1 是否要求 malloc et al 只返回所需最大值的指针。如果您为int 而不是double 分配了足够的空间,我不确定是否需要为double 返回对齐的内容。
  • @EricPostpischil 我同意malloc(sizeof(int)) 不必像malloc(sizeof(int)) 那样严格,但是“返回的指针......已适当对齐,以便可以将其分配给指向 的指针具有基本对齐要求的任何类型的对象......”(7.22.3 1)不提供。所有对象的指针返回对齐。
  • 当然,但是您可以分配给任何类型的对象这一事实并不意味着它必须具有该类型所需的对齐方式。 (C 有一条规则,如果满足对齐要求,则可以在对象类型之间转换指针。但这并不意味着即使不满足要求,实现也不能允许这样做。所以malloc(4) 可以返回一个 4-mod-8 指针,并且实现可以允许您将其分配给指向 8 字节 double 的指针,因为它具有简单的寻址方案,可以将任何指针分配给任何其他指针。显然,您不能……
  • ... 在指向的空间中存储一个double,但是您已经满足了可以分配指针的标准要求。
【解决方案2】:

分配器可以有任何最小块大小。这是实现细节。在您想更改程序的分配器之前,您不必关心这一点。

【讨论】:

    猜你喜欢
    • 2012-12-31
    • 1970-01-01
    • 1970-01-01
    • 2010-12-29
    • 2013-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-04
    相关资源
    最近更新 更多