Namespaces
Variants

std:: aligned_alloc

From cppreference.net
< cpp ‎ | memory ‎ | c
Memory management library
( exposition only* )
Allocators
Uninitialized memory algorithms
Constrained uninitialized memory algorithms
Memory resources
Uninitialized storage (until C++20)
( until C++20* )
( until C++20* )
( until C++20* )

Garbage collector support (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
Défini dans l'en-tête <cstdlib>
void * aligned_alloc ( std:: size_t alignment, std:: size_t size ) ;
(depuis C++17)

Alloue size octets de stockage non initialisé dont l'alignement est spécifié par alignment ( créant implicitement des objets dans la zone de destination). Le paramètre size doit être un multiple entier de alignment .

Les fonctions suivantes doivent être thread-safe :

Les appels à ces fonctions qui allouent ou désallouent une unité particulière de stockage se produisent dans un ordre total unique, et chaque appel de désallocation se produit-avant la prochaine allocation (le cas échéant) dans cet ordre.

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 std::free ou std::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 ).

À 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 cette exigence.

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

La fonction std::malloc standard aligne la mémoire de manière adaptée à tout type d'objet possédant un alignement fondamental. Cette fonction 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 C de Microsoft car son implémentation de std::free est incapable de gérer les allocations alignées de quelque type que ce soit. À la place, MS CRT fournit _aligned_malloc (à libérer avec _aligned_free ).

Exemple

#include <cstdio>
#include <cstdlib>
int main()
{
    int* p1 = static_cast<int*>(std::malloc(10 * sizeof *p1));
    std::printf("default-aligned address:   %p\n", static_cast<void*>(p1));
    std::free(p1);
    int* p2 = static_cast<int*>(std::aligned_alloc(1024, 1024));
    std::printf("1024-byte aligned address: %p\n", static_cast<void*>(p2));
    std::free(p2);
}

Sortie possible :

default-aligned address:   0x2221c20
1024-byte aligned address: 0x2222400

Voir aussi

(depuis C++11) (obsolète en C++23)
définit le type approprié pour une utilisation comme stockage non initialisé pour des types de taille donnée
(modèle de classe)
Documentation C pour aligned_alloc