Der C11-Standard fügte hinzu aligned_alloc
Funktion, um nicht initialisierten ausgerichteten Speicher zuzuweisen. Die Norm umfasst auch die calloc
Funktion zum Allokieren von Speicher, der mit Null initialisiert wird, ihn aber nur an der Größe des größten Typs ausrichtet.
Warum enthält der C11-Standard keine aligned_calloc
Funktion, die ausgerichteten Speicher zuweist, der mit Null initialisiert ist?
Mir ist bewusst, dass Sie das Ergebnis einfach memset können, um initialisierten Speicher zu erhalten, aber die calloc
Die Funktion ist auf einigen Betriebssystemen sehr nützlich, da der von den Kerneln bereitgestellte Speicher aus Sicherheitsgründen oft bereits mit Null initialisiert (und auf die Seitengröße ausgerichtet) sein muss.
calloc
können dies ausnutzen und doppelte Initialisierungen vermeiden.
Darüber hinaus bieten einige Betriebssysteme (wie Linux) Speicher im Copy-on-Write-Modus, der zusammen mit calloc
erlaubt es, primitive spärliche Datenstrukturen zu konstruieren. Ein initialisierendes Memset für das Ergebnis von aligned_alloc
zerstört diese Eigenschaft.
Es scheint mir, dass diese Vorteile, obwohl sie nicht übertragbar sind, ausreichen sollten, um eine zweite ausgerichtete Zuordnungsfunktion zu haben.
Wahrscheinlich, weil Design die Kunst ist, zu entscheiden, was aufgenommen und was weggelassen werden soll, und dies hat die Messlatte nicht erfüllt (obwohl viele Funktionen von fragwürdigem Nutzen dies getan haben). Wie auch immer, nichts hindert jede Implementierung daran, sie bereitzustellen und die Aufnahme in den nächsten Standard wahrscheinlicher zu machen.
– Deduplizierer
15. April 2014 um 19:32 Uhr
Nicht nur jedes System ist frei, eine bereitzustellen
aligned_calloc
aber Sie können die Funktionalität wahrscheinlich bereits auf vielen Systemen emulieren, indem Sie /dev/zero mit mmap() ausführen, was nicht dazu führen sollte, dass der Speicher sofort festgeschrieben wird.– Pascal Cuoq
15. April 2014 um 19:48 Uhr
Natürlich können Sie es auch selbst ausrichten, indem Sie einen Offset von einem benutzerdefinierten Calloc mit allocator zurückgeben, aber Sie können dies nicht übergeben oder mmap-Speicher freigeben, im Gegensatz zu align_alloc und posix_memalign zugewiesenem Speicher. Aber ich frage mich, ob es einen Grund für die Auslassung gibt, außer der Minimierung der Anzahl neuer Funktionen um der Reinheit willen.
– jtaylor
15. April 2014 um 20:36 Uhr
Wenn Sie Ihre eigenen mit rollen wollen
mmap
wie Pascal vorschlägt, würden Sie einfach verwendenmmap(MAP_ANONYMOUS)
anstatt tatsächlich zu öffnen/dev/zero
und Mapping.– Peter Cordes
24. April 2017 um 2:34 Uhr