Namensräume
Varianten
Aktionen

aligned_alloc

Von cppreference.com
< c‎ | memory
Definiert im Header <stdlib.h>
void *aligned_alloc( size_t alignment, size_t size );
(seit C11)

Allokiert size Bytes uninitialisierten Speichers, dessen Ausrichtung durch alignment spezifiziert wird. Der Parameter size muss ein ganzzahliges Vielfaches von alignment sein.

aligned_alloc ist threadsicher: Es verhält sich so, als ob nur auf die durch seine Argumente sichtbaren Speicherorte zugegriffen wird und nicht auf statische Speicherbereiche.

Ein vorheriger Aufruf von free, free_sized und free_aligned_sized(seit C23) oder realloc, der einen Speicherbereich deallokiert, *synchronisiert 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 deallokierende Funktion und vor jedem Zugriff auf den Speicher durch aligned_alloc. Es gibt eine einzige Gesamtordnung aller Allokations- und Deallokationsfunktionen, die auf einen bestimmten Speicherbereich wirken.

Inhalt

[edit] Parameter

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

[edit] Rückgabewert

Bei Erfolg wird ein Zeiger auf den Anfang des neu allokierten Speichers zurückgegeben. Um einen Speicherleck zu vermeiden, muss der zurückgegebene Zeiger mit free oder realloc deallokiert werden.

Bei einem Fehler wird ein Nullzeiger zurückgegeben.

[edit] Hinweise

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

Als Beispiel für die Anforderung "von der Implementierung unterstützt" 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 übernehmen diese Anforderungen.

Fundamentale 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 richtet Speicher für jeden Objekttyp mit fundamentaler Ausrichtung aus. aligned_alloc ist nützlich für über-ausgerichtete Allokationen, z. B. für SSE, Cache-Zeilen oder VM-Seiten-Grenzen.

Diese Funktion wird in der Microsoft C Runtime-Bibliothek nicht unterstützt, da ihre Implementierung von std::free nicht in der Lage ist, ausgerichtete Allokationen zu handhaben. Stattdessen bietet MS CRT _aligned_malloc (zu deallokieren mit _aligned_free).

[edit] 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

[edit] Referenzen

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

[edit] Siehe auch

C++ Dokumentation für aligned_alloc