std:: aligned_alloc
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
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 versions de bibliothèque de operator new et operator delete
- Les versions de remplacement utilisateur des operator new et operator delete globaux
- std::calloc , std::malloc , std::realloc , std::aligned_alloc , std::free
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
|
|