我在一台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 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。