2014-07-14 5 views
5

Die Zuordnungsfunktion versucht, die angeforderte Menge von Speicher zuzuordnen. Wenn es erfolgreich ist, gibt es die Adresse des Beginns eines Speicherblocks zurück, dessen Länge in Bytes mindestens so groß wie die angeforderte Größe sein soll.Adresse des Startblockspeichers

Was bedeutet diese Einschränkung? Kannst du ein Beispiel bekommen, das verletzt?

Es scheint, meine Frage ist unklar. UPD: Warum "mindestens"? Was ist der Punkt der Zuweisung mehr als angeforderte Größe? Kannst du passendes Beispiel bekommen?

+3

lesen Sie dies: http://StackOverflow.com/Questions/15604411/Memory-allocation-deallocation –

+0

Die einzige "Einschränkung", die ich sehe, ist der Fall von "wenn es erfolgreich ist", und ich sehe nichts, dass " verletzt ". Möchten Sie näher erläutern, was Sie meinen? –

+0

@MatsPetersson Siehe meine aktualisierte Frage –

Antwort

5

Die Zulage für die Zuteilung von „mehr als erforderlich“ ist es zu ermöglichen:

  1. gute Ausrichtung des nächsten Blocks von Daten.
  2. Reduzieren Sie die Einschränkungen, auf welchen Plattformen Code aus C und C++ kompiliert werden kann.
  3. Flexibilität bei der Gestaltung der Speicherzuordnungsfunktionalität.

Ein Beispiel für Punkt ist:

char *p1 = new char[1]; 
    int *p2 = new int[1]; 

Wenn wir genau 1 Byte bei der Adresse 0x1000 für die erste Zuweisung zuzuteilen, und folgen, die genau mit einer zweiten Zuweisung von 4 Bytes für einen int, die int beginnt bei Adresse 0x1001. Dies ist auf einigen Architekturen "gültig", führt jedoch oft zu einer "langsameren Last des Wertes", auf anderen Architekturen führt es direkt zu einem Absturz, weil auf eine Adresse, die kein gerades Vielfaches von int ist, nicht zugegriffen werden kann 4. Da die zugrundeliegende Architektur von new nicht wirklich weiß, wofür der Speicher schließlich verwendet wird, ist es am besten, sie bei "der höchsten Ausrichtung" zuzuordnen, was in den meisten Architekturen 8 oder 16 Bytes bedeutet. (Wenn der Speicher beispielsweise zum Speichern von SSE-Daten verwendet wird, benötigt er eine Ausrichtung von 16 Bytes)

Der zweite Fall wäre, wo "Zeiger nur auf ganze Blöcke von 32-Bit-Wörtern zeigen können". Solche Architekturen gab es in der Vergangenheit. In diesem Fall, selbst wenn wir das obige Problem mit der Ausrichtung ignorieren, ist der durch einen generischen Zeiger spezifizierte Speicherplatz zwei Teile, einer für die tatsächliche Adresse und einer für das "welches Byte innerhalb dieses Wortes".Da in dem Speicherzuordner typische Zuweisungen viel grßer als ein einzelnes Byte sind, entscheiden wir uns, nur den "Vollwort" -Zeiger zu verwenden, so dass alle Zuordnungen von vornherein immer auf ganze Wörter aufgerundet werden.

Der dritte Fall wäre beispielsweise die Verwendung eines Zuordnungsblocks "vordimensionierter Blöcke". Einige Echtzeit-Betriebssysteme haben beispielsweise eine feste Anzahl vordefinierter Größen, die sie z. B. 16, 32, 64, 256, 1024, 16384, 65536, 1M, 16M Bytes zuweisen. Zuordnungen werden dann auf die nächste gleiche oder größere Größe aufgerundet, sodass eine Zuweisung für 257 Byte aus der Größe 1024 zugewiesen wird. Die Idee hier ist, a) eine schnelle Zuteilung bereitzustellen, indem freie Blöcke in jeder Größe verfolgt werden, anstatt das traditionelle Modell, eine große Anzahl von Blöcken in irgendeiner Größe zu haben, um zu durchsuchen, um zu sehen, ob ein Block groß genug ist. Es hilft auch gegen Fragmentierung (wenn viel Speicher "frei" ist, aber die falsche Größe, also kann nicht verwendet werden - zum Beispiel, wenn eine Schleife ausgeführt wird, bis das System nicht genügend Speicher hat, Blöcke von 64 Bytes zuweist, dann frei Jeden anderen, und versuchen, einen 128-Byte-Block zuzuweisen, gibt es keinen einzigen 128-Byte-Block frei, weil der gesamte Speicher in kleine 64-Byte-Abschnitte aufgeteilt ist).

4

Dies bedeutet, dass die Zuweisungsfunktion eine Adresse eines Speicherblocks zurückgeben soll, dessen Größe mindestens der Größe entspricht, die Sie angefordert haben.
Die meisten Zuweisungsfunktionen geben jedoch eine Adresse eines Speicherblocks zurück, dessen Größe größer als die angeforderte ist, und die nächsten Zuordnungen geben eine Adresse innerhalb dieses Blocks zurück, bis es das Ende davon erreicht.
Die wichtigsten Gründe für dieses Verhalten sind:

  1. minimieren die Anzahl der neuen Speicherblock Zuweisungen (jeder Block mehrere Zuweisungen enthalten kann), die in Bezug auf die Zeit Komplexität teuer sind.
  2. Spezifische Ausrichtungsprobleme.
+0

Konnten Sie meine aktualisierte Frage sehen? –

+0

@ St.Antario Ich kann es jetzt sehen. – eladm26

+0

@Mark Warum haben Sie die Version 1 wiederhergestellt? Du weißt, dass es Grammatikfehler enthält, oder? – edmz

3

Die beiden häufigsten Gründe, warum Zuordnung
ein Block größer als die angeforderte zurückgibt, ist

  1. Ausrichtung
  2. Buchhaltung
2

Es kann so sein, weil in modernen Betriebssystemen es effektiv viel ist Zuweisen einer Speicherseite, die 512 kb sein kann. Die interne malloc-Funktionalität kann also nur diese Seite des Arbeitsspeichers zuweisen, den Anfang mit einigen Serviceinformationen füllen, in wie viele Unterblöcke sie aufgeteilt sind, ihre Größen usw. Und erst danach gibt es Ihnen eine Adresse, die für Ihre Bedürfnisse geeignet ist . Der nächste Aufruf von malloc wird beispielsweise einen anderen Teil dieser zugeordneten Seite zurückgeben. Es spielt keine Rolle, dass der Speicherblock auf die angeforderte Größe beschränkt ist. In der Tat können Sie diesen Puffer heap-over-over wegen keinen sicheren Mechanismus, um diese Art von Aktivität zu verhindern. Sie können auch Ausrichtungsfragen berücksichtigen, die andere Responder oben angegeben haben. Es gibt genug Arten von Speicherverwaltung. Sie können es googlen, wenn Sie genug interessiert sind (Best Fit, First Fit, Last Fit, korrigieren Sie mich, wenn ich falsch liege).

Verwandte Themen