是否有最小的堆大小

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

#include  #include  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?

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

是否有最小的堆大小(?)

听起来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。