2017-04-11 122 views
1

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

如果我运行PROGRAMM输出为4。 所以堆块大小应该是4字节报头+ 4字节大小+ 4字节(的sizeof结构) 因此堆应为12个字节等于位于0xC

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

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

+5

'malloc'的实现细节不受任何标准的规范。打开它的源代码,看看它是否真的对你很重要。 –

+1

* malloc()可能获得16字节(或更大)块的内存。在这种情况下,很可能会有比您想象的更多的开销,或者仅仅是从操作系统获得的空间比您要求的要多。并不是说任何这样的额外空间都可以安全使用,''malloc()'可能会使用它来满足未来的一些请求,而不需要从操作系统获得额外的内存。 –

+0

我如何获得我的malloc源代码? @Eugene Sh。 –

回答

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。

+0

6.2.8 2没有定义基本对齐方式等于'_Alignof(max_align_t)'。它提到实现支持的最大对齐方式与此相同。 ** A **(不是** **)基本对齐小于或等于此。基本对齐是按类型的; 'char','int'和'double'每个都有自己的基本对齐。所以我不确定7.22.3 1是否要求'malloc' * et al *只返回所需最大值的指针。如果你为'int'分配足够的空间而不是'double',我不确定是否需要返回一个'double'对齐的东西。 –

+0

@EricPostpischil我同意'malloc(sizeof(int))'不必像'malloc(sizeof(int))'那样受到限制,但“返回的指针......被适当地对齐,以便它可以被分配给指向**具有基本对齐要求的任何**类型的对象...“(7.22.3 1)不提供该指示。指针返回对齐所有对象。 – chux

+0

当然,但您可以分配给任何类型的对象的事实并不意味着它必须具有该类型所需的对齐方式。 (C有一条规则,即如果对齐需求满足,转换对象类型之间的指针就可以工作,但这并不意味着即使需求不满足,实现也不允许这样做,因此'malloc(4)'可以返回一个4-mod- 8指针,实现可以让你把它分配给一个8字节的'double'指针,因为它有一个简单的寻址方案,可以将任何指针指定给任何其他指针,很显然,你不能... –