是否有最小的堆大小

问题描述 投票:1回答:2

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

c++ c
2个回答
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。

© www.soinside.com 2019 - 2024. All rights reserved.