Warum gibt es in C11 keinen ausgerichteten Calloc

Lesezeit: 3 Minuten

Benutzer-Avatar
jtaylor

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 verwenden mmap(MAP_ANONYMOUS) anstatt tatsächlich zu öffnen /dev/zero und Mapping.

    – Peter Cordes

    24. April 2017 um 2:34 Uhr

Benutzer-Avatar
hanumantmk

Die beste Vermutung, die ich anbieten könnte, ist, dass ein aligned_calloc speziell gegen eines der expliziten Ziele der C1X-Charta verstößt:

Anders als bei C9X war man sich beim Londoner Treffen einig, dass es ausnahmslos keine Erfindung geben sollte. Es sollten nur solche Features berücksichtigt werden, die eine Vorgeschichte haben und von einer kommerziellen Implementierung gemeinsam verwendet werden. Außerdem muss darauf geachtet werden, diese Merkmale so zu standardisieren, dass der Standard und die kommerzielle Implementierung kompatibel sind.

http://www.open-std.org/JTC1/SC22/wg14/www/docs/n1250.pdf

Wenn man sich nach kommerziellen Implementierungen umsieht, war aligned_malloc weithin verfügbar und auf fast allen Plattformen üblich. Ein ausgerichteter Calloc hätte auf vielen Plattformen mehr als Wrapping benötigt, um mehr als das Paar aligned_malloc() + memset() zu bieten, könnte daher als erfinderisch angesehen werden und wurde daher ausgelassen.

Das wäre meine beste Vermutung.

  • Das ist eine gute Antwort, aber nicht sehr befriedigend. Es stellt sich im Grunde die Frage, warum bestimmte Plattformen überhaupt keine nicht standardmäßige API dafür bereitstellen. AFAIK, nicht einmal Linux+glibc bietet eine solche Funktion.

    – Peter Cordes

    24. April 2017 um 2:32 Uhr


1230040cookie-checkWarum gibt es in C11 keinen ausgerichteten Calloc

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy