Auswahl einer Größe für einen Puffer

8

Ich bin verwirrt, wenn Sie Speicher mit malloc zuweisen, müssen Sie eine Größe angeben, jedoch kommt es manchmal vor, dass Sie nicht die Größe wissen, die Sie an diesem Punkt benötigen, so dass Sie entweder eine große Menge an Speicher zuweisen ( was nicht zu klug klingt, da Sie wahrscheinlich nicht alles verwenden werden) oder Sie verwenden realloc , wenn die anfängliche Puffergröße zu klein wird. Sind diese beiden Optionen gültig? Der zweite klingt gut, aber die Dokumente sagen, dass realloc ...may move the memory block to a new location klingt wie eine sehr schlechte Idee / schwer zu behandelnde Situation (zB wenn Sie mehrere Zeiger auf die gleiche Adresse zeigen, wenn Sie realloc sie aufrufen alle werden ungültig) Ich bin ein Anfänger mit C, kann mir jemand erklären, wie man mit der Situation umgeht, in der man einen Puffer hat, der vielleicht viel Speicher braucht oder auch nicht.

    
Meda 22.02.2013, 21:08
quelle

2 Antworten

5
  

Manchmal passiert es, dass Sie die Größe, die Sie an diesem Punkt benötigen, nicht kennen, und Sie entweder eine große Menge an Speicher zuweisen (was nicht zu klug klingt, weil Sie wahrscheinlich nicht alles verwenden werden) oder Sie Verwenden Sie realloc, wenn die anfängliche Puffergröße zu klein wird. Sind diese beiden Optionen gültig?

Im Prinzip ja. In der Praxis ist es bei modernen OS -Kernen und Standardsystemkonfigurationen egal, wie viel Sie mit malloc zuweisen. Sie sehen, malloc weist Adressraum zu, nicht Speicher. Sie können so viel Adressraum zuweisen, wie Sie möchten, dass er nicht wirklich Speicher verbraucht; Natürlich wird das Betriebssystem mehrere Plausibilitätsprüfungen für den Wert verwenden, zum Beispiel auf einem System mit nur 2GiB Speicher verfügbar (RAM + Swap), das Sie 3GiB nicht zuordnen können. Die übliche Konfiguration besteht darin, dass der größte Teil des Adressraums, der in einem einzelnen Chunk zugewiesen werden kann, 50% des verfügbaren Systemspeichers ausmacht.

Nur wenn Sie tatsächlich etwas schreiben, wird das OS Speicher dafür reservieren. Verwenden Sie also nicht Calloc , weil es den Speicher mit initialisiert, d. H. Etwas hinein schreibt.

Wenn Sie also nicht wissen, wie viel genau Sie benötigen, malloc nur einen großen Teil des Adressraums, für den Sie wissen, durch die Eigenschaften der Art der verarbeiteten Daten, dass es leicht hält, was auch immer Sie ' erwarten. Sobald Sie es im Speicher haben, können Sie realloc verwenden, um die Zuweisung zu verkleinern. Für alle Implementierungen, die wichtig sind, wird realloc niemals Daten verschieben, wenn eine Zuweisung verkleinert wird.

Eine Sache, auf die Sie achten sollten, ist Speicherüberlastung: Sagen wir, Sie haben 5 Prozesse auf einem System mit 4GiB RAM, jede Zuweisung 1GiB, aber nicht sofort darauf schreiben. Das OS wird ihnen diesen Adressraum geben, d. H. Es überbrückt Speicher (genau wie Fluggesellschaften Flugplätze überkompensieren). Einige Zeit später fangen die Prozesse an, darauf zu schreiben. Irgendwann hat das System keinen Speicher mehr und das Betriebssystem muss etwas dagegen tun: Es wird Prozesse beenden, bis wieder Platz zum "Atmen" ist.

Sie können die Speicherüberbelegung jedoch ausschalten; dringend empfohlen für Systeme mit hoher Zuverlässigkeit.

    
datenwolf 22.02.2013, 21:32
quelle
3

Sie haben Recht - das sind so ziemlich Ihre beiden Möglichkeiten. Sie können das Problem "multiple pointers" umgehen, indem Sie ein Bit abstrahieren. Wenn Sie den von malloc zurückgegebenen Zeiger nicht direkt übergeben, kleben Sie ihn in eine andere Datenstruktur:

%Vor%

Und übergeben Sie stattdessen Zeiger auf diese Datenstruktur, Sie können p jederzeit ändern, und jeder, der den Zeiger auf Ihre neue Struktur teilt, wird entsprechend aktualisiert:

%Vor%     
Carl Norum 22.02.2013 21:12
quelle

Tags und Links