Namespaces
Variants

aligned_alloc

From cppreference.net
Definiert in Header <stdlib.h>
void * aligned_alloc ( size_t alignment, size_t size ) ;
(seit C11)

Reserviere size Bytes nicht initialisierten Speichers, dessen Ausrichtung durch alignment spezifiziert wird. Der size -Parameter muss ein ganzzahliges Vielfaches von alignment sein.

aligned_alloc ist threadsicher: Es verhält sich so, als würde es nur auf die Speicherbereiche zugreifen, die durch sein Argument sichtbar sind, und nicht auf statischen Speicher.

Ein vorheriger Aufruf von free , free_sized , und free_aligned_sized (seit C23) oder realloc , der einen Speicherbereich freigibt, synchronisiert sich mit einem Aufruf von aligned_alloc , der denselben oder einen Teil desselben Speicherbereichs allokiert. Diese Synchronisation erfolgt nach jedem Zugriff auf den Speicher durch die freigebende Funktion und vor jedem Zugriff auf den Speicher durch aligned_alloc . Es gibt eine einzige Gesamtreihenfolge aller Allokations- und Deallokationsfunktionen, die auf jeden bestimmten Speicherbereich wirken.

Inhaltsverzeichnis

Parameter

alignment - gibt die Ausrichtung an. Muss eine gültige, durch die Implementierung unterstützte Ausrichtung sein.
size - Anzahl der zu allokierenden Bytes. Ein ganzzahliges Vielfaches von alignment

Rückgabewert

Bei Erfolg gibt die Funktion einen Zeiger auf den Anfang des neu zugewiesenen Speichers zurück. Um einen Speicherverlust zu vermeiden, muss der zurückgegebene Zeiger mit free oder realloc freigegeben werden.

Bei Fehler wird ein Nullzeiger zurückgegeben.

Hinweise

Das Übergeben einer size , die kein ganzzahliges Vielfaches von alignment ist, oder eines alignment , das ungültig oder nicht durch die Implementierung unterstützt wird, führt dazu, dass die Funktion fehlschlägt und einen Nullzeiger zurückgibt (C11, wie veröffentlicht, spezifizierte in diesem Fall undefiniertes Verhalten, dies wurde korrigiert durch DR460 ). Die Aufhebung der Größenbeschränkungen, um die Allokation kleiner Objekte an restriktiven Ausrichtungsgrenzen zu ermöglichen (ähnlich wie alignas ), wurde vorgeschlagen durch N2072 .

Als Beispiel für die "vom Implementierung unterstützte" Anforderung akzeptiert die POSIX-Funktion posix_memalign jede alignment , die eine Zweierpotenz und ein Vielfaches von sizeof ( void * ) ist, und POSIX-basierte Implementierungen von aligned_alloc erben diese Anforderungen.

Grundlegende Ausrichtungen werden immer unterstützt. Wenn alignment eine Zweierpotenz ist und nicht größer als _Alignof ( max_align_t ) , kann aligned_alloc einfach malloc aufrufen.

Reguläres malloc aligniert Speicher, der für jeden Objekttyp mit einer grundlegenden Ausrichtung geeignet ist. aligned_alloc ist nützlich für überausgerichtete Zuweisungen, wie z.B. für SSE , Cache-Line-Grenzen oder VM-Seitengrenzen .

Diese Funktion wird in der Microsoft C-Laufzeitbibliothek nicht unterstützt, da deren Implementierung von std::free keine ausgerichteten Allokationen verarbeiten kann jeglicher Art. Stattdessen bietet MS CRT _aligned_malloc (zu freigeben mit _aligned_free ).

Beispiel

#include <stdio.h>
#include <stdlib.h>
int main(void)
{
    int *p1 = malloc(10*sizeof *p1);
    printf("default-aligned addr:   %p\n", (void*)p1);
    free(p1);
    int *p2 = aligned_alloc(1024, 1024*sizeof *p2);
    printf("1024-byte aligned addr: %p\n", (void*)p2);
    free(p2);
}

Mögliche Ausgabe:

default-aligned addr:   0x1e40c20
1024-byte aligned addr: 0x1e41000

Referenzen

  • C23-Standard (ISO/IEC 9899:2024):
  • 7.22.3.1 Die aligned_alloc-Funktion (S.: TBD)
  • C17-Standard (ISO/IEC 9899:2018):
  • 7.22.3.1 Die aligned_alloc-Funktion (S: 253)
  • C11-Standard (ISO/IEC 9899:2011):
  • 7.22.3.1 Die aligned_alloc-Funktion (S: 347-348)

Siehe auch

C++ Dokumentation für aligned_alloc