C / C ++ - Warum ist der Heap so groß, wenn ich Platz für ein einzelnes int reserviere?

8

Ich verwende derzeit gdb, um die Auswirkungen von Low-Level-Code zu sehen. Im Moment mache ich folgendes:

%Vor%

Wenn ich den Speicher mit info proc mappings in gdb untersuche, sehe ich nach dem, was ich vermute, den .text-Abschnitt (da Objfile den Namen des binären Debuggers anzeigt):

%Vor%

Wie kommt es, dass der Haufen so groß ist, wenn ich nur Platz für ein einzelnes int zugewiesen habe?

Die seltsamste Sache ist, auch wenn ich calloc(1000, sizeof(int)) mache, bleibt die Größe des Heaps gleich.

PS: Ich benutze Ubuntu 14.04 auf einem x86_64-Rechner. Ich kompiliere die Quelle mit g ++ (ja, ich weiß, ich sollte Calloc in C ++ nicht verwenden, das ist nur ein Test).

    
Martin 29.05.2014, 16:10
quelle

2 Antworten

8
  

Wie kommt es, dass der Haufen so groß ist, wenn ich nur Platz für ein einzelnes int zugewiesen habe?

Ich habe einen einfachen Test unter Linux gemacht. Wenn man calloc glibc aufruft, wird irgendwann sbrk () aufgerufen, um Speicher vom Betriebssystem zu holen:

%Vor%

Aber glibc fragt das Betriebssystem nicht nach genau 4 Bytes, die Sie angefordert haben. glibc berechnet seine eigene Größe. So wird es in glibc gemacht:

%Vor%

mp_.top_pad ist standardmäßig 128 * 1024 Bytes, also ist es der Hauptgrund, warum das System, wenn Sie nach 4 Bytes fragen, 0x21000 Bytes zuweist.

Sie können mp_.top_pad mit dem Aufruf von mallopt anpassen. Dies ist aus dem Dokument von mallopt:

%Vor%

Also habe ich Ihr Programm geändert und mallopt hinzugefügt:

%Vor%

Ich setze 1 Byte padding und laut doc muss es be always rounded to a system page boundary sein.

Das sagt mir gdb für mein Programm:

%Vor%

Also jetzt ist der Heap 4096 Bytes. Genau die Größe meiner Seite:

%Vor%

Nützliche Links:

Sergei Kurenkov 30.05.2014, 09:30
quelle
-4

Da Sie C / C ++ erwähnt haben, verwenden Sie besser das folgende Konstrukt:

%Vor%     
Dr. Debasish Jana 30.05.2014 09:34
quelle

Tags und Links