GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Behält realloc die Speicherausrichtung von posix_memalign bei?

Nein, 01 auf dem von 10 zurückgegebenen Speicher wird weder von ISO noch von POSIX garantiert, dass dieselbe Ausrichtung beibehalten wird. A 28 kann Erweitern Sie einfach den aktuellen Block an derselben Adresse, aber es kann auch den Block an eine andere Adresse verschieben, deren Ausrichtung weniger streng ist als die des Originals.

Wenn Sie die gleiche Ausrichtung wünschen, ist es wahrscheinlich am besten, einen anderen Block zuzuweisen und die Daten zu kopieren.

Leider gibt es keine 32 Funktion in der Single UNIX Specification entweder.

Wenn Sie sich nicht die Mühe machen möchten, Daten alle zu kopieren Mal könntest du den 40 ausprobieren und wenn die Ausrichtung nicht wie erwartet war, dann und nur dann rufen Sie 58 an um eine korrekt ausgerichtete Adresse zu erhalten und die Daten dorthin zu kopieren, um die alte Adresse freizugeben, wenn Sie fertig sind.

Dies kann zu Folgendem führen:

  • Null Kopien (wenn der aktuelle Block direkt erweitert werden kann);
  • eine Kopie (falls 61 kopiert, ergibt aber zufällig einen korrekt ausgerichteten Block); oder
  • zwei Kopien (falls 73 Kopien und dann müssen Sie wegen Fehlausrichtung auch kopieren).

Es kann führen auch zu weniger Kopieren als angegeben, abhängig von der zugrunde liegenden Speicherverwaltungsimplementierung. Beispielsweise kann eine "Kopie" einfach die Neuzuordnung von Speicherblöcken beinhalten, anstatt die Daten physisch zu verschieben.

Vielleicht möchten Sie also einige Statistiken führen, um zu sehen, ob sich dieses Schema lohnt.

Denken Sie nur daran, dass weder POSIX- noch Linux-Manpages angeben, ob Sie überhaupt können Übergeben Sie diese Zeiger an 89 , nur dass Sie sie an 99 übergeben können .

Basierend auf dem aktuellen GNU-Libc-Quellcode scheint es jedoch zu funktionieren, obwohl das keine Garantie dafür ist, dass es auch in Zukunft funktioniert :-)

Meine Befürchtung war, dass es den Speicher normal zuweisen würde (Standardausrichtung) und eine Offset-Adresse zurückgeben würde (dh nicht die tatsächlich zugewiesene Adresse, sondern eine 107). Bytes darüber hinaus), die 114 war intelligent genug, sich wieder in die eigentliche Adresse zu verwandeln, bevor es seine Magie entfaltete.

Eine Möglichkeit wäre, das Ist zu speichern Adresse unmittelbar vor der zurückgesendeten Adresse, was aber selbst bei regulären Zuteilungen natürlich zu Streuverlusten führen würde.

In diesem Fall 120 wurde möglicherweise intelligent gemacht (da die Spezifikationen besagen, dass es in der Lage sein muss, die von 134 vorgenommenen Zuweisungen zu verarbeiten ), aber 146 möglicherweise nicht die gleichen Informationen erhalten (da die Dokumente zu dieser Angelegenheit schweigen).

Basierend auf GNU glibc 2.14.1 weist es jedoch tatsächlich mehr Speicher als benötigt zu und fummelt dann an der Arena herum, um den Prespace und Postspace freizugeben, sodass die zurückgegebene Adresse eine "echte" Adresse ist, die von 159 oder 165 .

Aber wie gesagt, die Dokumentation garantiert dies nicht.


Linux
  1. Liest Tail die ganze Datei?

  2. Finden Sie den Computer in einem LAN-Netzwerk?

  3. malloc gibt Arbeitsspeicher oder virtuellen Adressraum zurück

  4. Wo speichert Linux Mint die Dateien für Standard-Desktop-Hintergründe?

  5. Woher weiß die CPU, welche physikalische Adresse welcher virtuellen Adresse zugeordnet ist?

Der Linux-Kernel:Top 5 Innovationen

Verwenden des kostenlosen Linux-Befehls

Linux – Wie entscheidet der Oom-Killer, welcher Prozess zuerst getötet wird?

Warum wacht der Bildschirmschoner bei der Verwendung von Vlc immer wieder auf?

Linux – Was bedeutet das virtuelle Kernel-Speicherlayout in Dmesg?

Wie funktioniert Swap-Speicher in Linux?