509 Stimmen

Woher weiß free, wie viel free zu geben ist?

In der C-Programmierung können Sie jede Art von Zeiger als Argument an free übergeben. Woher weiß er, wie groß der Speicher ist, der freigegeben werden soll? Immer wenn ich einen Zeiger an eine Funktion übergebe, muss ich auch die Größe übergeben (d.h. ein Array mit 10 Elementen muss 10 als Parameter erhalten, um die Größe des Arrays zu kennen), aber ich muss die Größe nicht an die free-Funktion übergeben. Warum nicht, und kann ich dieselbe Technik in meinen eigenen Funktionen verwenden, damit ich nicht die zusätzliche Variable für die Länge des Arrays mit mir herumschleppen muss?

3voto

Timbo Punkte 26346

Der Heap-Manager hat die zum zugewiesenen Block gehörende Speichermenge irgendwo gespeichert, als Sie die malloc .

Ich habe selbst nie eine implementiert, aber ich vermute, dass der Speicher direkt vor dem zugewiesenen Block die Metainformationen enthalten könnte.

3voto

DigitalRoss Punkte 138823

Die ursprüngliche Technik bestand darin, einen etwas größeren Block zuzuweisen und die Größe am Anfang zu speichern und dann der Anwendung den Rest des Blogs zu überlassen. Der zusätzliche Platz enthält eine Größe und möglicherweise Links, um die freien Blöcke zur Wiederverwendung zusammenzufassen.

Es gibt jedoch einige Probleme mit diesen Tricks, wie z. B. schlechtes Cache- und Speicherverwaltungsverhalten. Die Verwendung von Speicher direkt im Block neigt dazu, Dinge unnötig auszulagern, und es entstehen schmutzige Seiten, die die gemeinsame Nutzung und das Copy-on-Write erschweren.

Eine fortgeschrittenere Technik besteht darin, ein separates Verzeichnis zu führen. Es wurden auch exotische Ansätze entwickelt, bei denen Bereiche des Speichers die gleiche Zweierpotenz verwenden.

Im Allgemeinen lautet die Antwort: eine separate Datenstruktur für die Speicherung des Zustands zugewiesen wird.

2voto

LiraNuna Punkte 61060

malloc() y free() sind system-/compilerabhängig, so dass es schwer ist, eine konkrete Antwort zu geben.

Weitere Informationen zu dieser anderen Frage .

2voto

MSalters Punkte 166675

Um die zweite Hälfte Ihrer Frage zu beantworten: Ja, Sie können, und ein ziemlich häufiges Muster in C ist das folgende:

typedef struct {
    size_t numElements
    int elements[1]; /* but enough space malloced for numElements at runtime */
} IntArray_t;

#define SIZE 10
IntArray_t* myArray = malloc(sizeof(intArray_t) + SIZE * sizeof(int));
myArray->numElements = SIZE;

1voto

avish Punkte 38

Um die zweite Frage zu beantworten: Ja, Sie können (in gewisser Weise) die gleiche Technik anwenden wie malloc() indem die erste Zelle in jedem Array einfach der Größe des Arrays zugewiesen wird. Dadurch können Sie das Array ohne ein zusätzliches Größenargument senden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X