2017-04-11 2 views
1

Ich bin auf einer 32bit alten Maschine. Und wollen lernen, wie es tief geht. Die Heap-Implementierung auf diesem System ist wirklich alt. Ich denke, es verwendet einen älteren malloc-Algorithmus. Jetzt ist meine Frage. Das ist mein Programm.Gibt es eine minimale Heap Größe

#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; 
} 

Wenn ich das Programm die Ausgabe laufen ist 4. also der Heap Chunkgröße 4Byte Header + 4 Byte groß sein sollte + 4 Byte (sizeof struct) so sollte der Haufen 12 Bytes gleich zu 0xc

Aber wenn ich auf den Heap in gdb schaue, sagt es mir die Größe eines Stücks von 0x10 entspricht 16 Bytes, aber woher sind die anderen 4 Bytes. Das verwirrt mich!

Oder ist es möglich, dass eine minimale Chunksize existiert, die 0x10 ist?

+5

'malloc' Implementierungsdetails sind in keiner Norm geregelt. Öffnen Sie den Quellcode und schauen Sie dort nach, ob es Ihnen wirklich wichtig ist. –

+1

Es ist * absolut * möglich, dass 'malloc()' Speicher in 16-Byte- (oder größeren) Chunks erhält. In diesem Fall könnte es durchaus sein, dass mehr Overhead vorhanden ist, als Sie vermuten, oder einfach, dass mehr Speicherplatz vom Betriebssystem bezogen wurde, als Sie angefordert haben. Nicht, dass ein solcher zusätzlicher Speicherplatz sicher zu verwenden wäre - "malloc()" könnte es möglicherweise verwenden, um einige zukünftige Anforderungen zu erfüllen, ohne zusätzlichen Speicher vom Betriebssystem zu erhalten. –

+0

Wie bekomme ich meinen malloc Quellcode? @Eugene Sh. –

Antwort

1

Der Zuweiser kann eine Mindeststückgröße haben. Es ist Implementierungsdetails. Sie müssen sich nicht darum kümmern, bis Sie den Zuordner für Ihr Programm ändern möchten.

1

Gibt es eine minimale Heap-Größe (?)

Es klingt wie OP die minimale Zuordnungsgröße wissen will, nicht die Gesamtgröße der „Halde“.


All *alloc(), wenn erfolgreiche Rückkehr nicht NULL (** siehe unten), "yield einen Zeiger auf ein Objekt disjunkt von jedem anderen Objekt." C11 §7.22.3 1.

Alle solche Zeiger erfüllen die grundlegende Ausrichtung Anforderung.

Die grundsätzliche Ausrichtung ist „gleich _Alignof(max_align_t)“ §6.2.8 2

So die sizeof(max_align_t), Beispiel 4, ist ein untere Schranke Minimum für eine „Haufen“ Zuteilung und alle Zuordnung wird auch ein Vielfaches von 4.

In der Regel Zuweisungen verursachen einen Overhead pro Zuordnung, manchmal nur 1 sizeof(max_align_t). In unserem Beispielsystem wäre die untere Grenze dann 8.

ist es möglich, dass eine minimale Chunksize existiert, die 0x10 ist?

Ja. Aus Gründen der Performance oder zur Minimierung der Fragmentierung können Zuordnungen die Mindestgröße auf eine untere Grenze wie 16 begrenzen. @ John Bollinger

Die absolute niedrigere Zuordnungsgröße variiert von Plattform zu Plattform. Wird nicht von C spezifiziert, außer dass es die Einschränkungen der Grundausrichtung erfüllt.


** Detail: malloc(0) erfolgreich NULL zurückkehren, so dass man in diesem pathologischen Fall, die min Zuordnungsgröße 0 sagen konnte.

+0

6.2.8 2 definiert keine fundamentale Ausrichtung, die gleich '_Alignof (max_align_t)' ist. Es wird erwähnt, dass die maximale Ausrichtung, die von der Implementierung unterstützt wird, gleich ist. ** Eine ** (nicht ** die **) Grundausrichtung ist kleiner oder gleich. Grundlegende Ausrichtung ist pro Typ; 'char',' int' und 'double' haben jeweils ihre eigene Grundausrichtung. Also bin ich mir nicht sicher 7.22.3 1 erfordert 'malloc' * et al * nur Zeiger mit dem maximal erforderlichen zurückzugeben. Wenn Sie gerade genug Platz für ein "int", aber nicht für ein "double" reservieren, bin ich nicht sicher, ob es erforderlich ist, etwas für ein "double" ausgerichtet zurückzugeben. –

+0

@EricPostpischil Ich stimme zu, dass 'malloc (sizeof (int))' nicht so restriktiv sein muss wie 'malloc (sizeof (int))', aber "Der zurückgegebene Zeiger ... ist passend ausgerichtet, so dass er a zugewiesen werden kann Zeiger auf ** alle ** Objekttypen mit einer grundlegenden Ausrichtung Anforderung ... "(7.22.3 1) bietet dies nicht. Die Zeigerrückführung ist für alle Objekte ausgerichtet. – chux

+0

Sicher, aber die Tatsache, dass Sie jeder Art von Objekt zuweisen können, bedeutet nicht, dass es notwendigerweise die Ausrichtung hat, die dieser Typ erfordert. (C hat die Regel, dass das Konvertieren von Zeigern zwischen Objekttypen funktioniert, wenn die Ausrichtungsanforderungen erfüllt sind. Aber das bedeutet nicht, dass eine Implementierung dies nicht erlauben kann, selbst wenn die Anforderungen nicht erfüllt sind. So könnte "malloc (4)" einen 4-mod- 8 Zeiger, und die Implementierung können Sie einen Zeiger auf eine 8-Byte- "double" zuweisen, da es ein einfaches Adressierungsschema hat, das in Ordnung ist mit jedem Zeiger auf einen anderen Zeiger zuweisen. Offensichtlich können Sie nicht ... –

Verwandte Themen