是否有最小的堆大小

时间:2017-04-11 20:58:14

标签: c++ c

我在一台32位旧机器上。并希望深入了解事情的进展情况。这个系统上的Heap实现真的很旧我认为它使用了较旧的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头+ 4byte大小+ 4byte(sizeof struct) 所以堆应该是12个字节等于0xc

但是如果我查看gdb中的堆,它告诉我一块0x10的大小 等于16字节,但从其他4字节的位置。那令我困惑!

或者是否可能存在最小的块大小,即0x10?

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

  

是否存在最小堆大小(?)

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

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

所有这些指针都符合基本对齐要求。

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

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

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

  

是否可能存在最小的块大小,即0x10?

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

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

**详细信息:malloc(0)可以成功返回NULL,因此可以说在该病态情况下,最小分配大小为0.