2017-04-11 86 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'指針,因爲它有一個簡單的尋址方案,可以將任何指針指定給任何其他指針,很顯然,你不能... –