Namespaces
Variants

aligned_alloc

From cppreference.net
Défini dans l'en-tête <stdlib.h>
void * aligned_alloc ( size_t alignment, size_t size ) ;
(depuis C11)

Alloue size octets de stockage non initialisé dont l'alignement est spécifié par alignment . Le paramètre size doit être un multiple entier de alignment .

aligned_alloc est sûr en contexte multithread : il se comporte comme s'il n'accédait qu'aux emplacements mémoire visibles via son argument, et non à un stockage statique.

Un appel précédent à free , free_sized , et free_aligned_sized (depuis C23) ou realloc qui désalloue une région de mémoire se synchronise avec un appel à aligned_alloc qui alloue la même région ou une partie de la même région de mémoire. Cette synchronisation se produit après tout accès à la mémoire par la fonction de désallocation et avant tout accès à la mémoire par aligned_alloc . Il existe un ordre total unique pour toutes les fonctions d'allocation et de désallocation opérant sur chaque région de mémoire particulière.

Table des matières

Paramètres

alignment - spécifie l'alignement. Doit être un alignement valide pris en charge par l'implémentation.
size - nombre d'octets à allouer. Un multiple entier de alignment

Valeur de retour

En cas de succès, retourne le pointeur vers le début de la mémoire nouvellement allouée. Pour éviter une fuite de mémoire, le pointeur retourné doit être désalloué avec free ou realloc .

En cas d'échec, retourne un pointeur nul.

Notes

Passer une size qui n'est pas un multiple entier de alignment ou un alignment qui n'est pas valide ou non supporté par l'implémentation entraîne l'échec de la fonction et renvoie un pointeur nul (le C11, tel que publié, spécifiait un comportement indéfini dans ce cas, ce qui a été corrigé par DR460 ). La suppression des restrictions de taille pour permettre l'allocation de petits objets à des limites d'alignement restrictives (similaire à alignas ) a été proposée par N2072 .

À titre d'exemple de l'exigence "prise en charge par l'implémentation", la fonction POSIX posix_memalign accepte tout alignment qui est une puissance de deux et un multiple de sizeof ( void * ) , et les implémentations basées sur POSIX de aligned_alloc héritent de ces exigences.

Les alignements fondamentaux sont toujours pris en charge. Si alignment est une puissance de deux et n'est pas supérieur à _Alignof ( max_align_t ) , aligned_alloc peut simplement appeler malloc .

La fonction malloc standard aligne la mémoire de manière appropriée pour tout type d'objet ayant un alignement fondamental. La fonction aligned_alloc est utile pour les allocations sur-alignées, comme pour les limites SSE , de ligne de cache, ou de page mémoire virtuelle .

Cette fonction n'est pas prise en charge dans la bibliothèque d'exécution Microsoft C car son implémentation de std::free est incapable de gérer les allocations alignées de toute nature. À la place, MS CRT fournit _aligned_malloc (à libérer avec _aligned_free ).

Exemple

#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);
}

Sortie possible :

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

Références

  • Norme C23 (ISO/CEI 9899:2024) :
  • 7.22.3.1 La fonction aligned_alloc (p: TBD)
  • Norme C17 (ISO/CEI 9899:2018) :
  • 7.22.3.1 La fonction aligned_alloc (p: 253)
  • Norme C11 (ISO/CEI 9899:2011) :
  • 7.22.3.1 La fonction aligned_alloc (p: 347-348)

Voir aussi

Documentation C++ pour aligned_alloc