Die Zulage für die Zuteilung von „mehr als erforderlich“ ist es zu ermöglichen:
- gute Ausrichtung des nächsten Blocks von Daten.
- Reduzieren Sie die Einschränkungen, auf welchen Plattformen Code aus C und C++ kompiliert werden kann.
- 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).
lesen Sie dies: http://StackOverflow.com/Questions/15604411/Memory-allocation-deallocation –
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? –
@MatsPetersson Siehe meine aktualisierte Frage –