_aligned_malloc
Alloue de la mémoire sur une limite d'alignement spécifiée.
Syntaxe
void * _aligned_malloc(
size_t size,
size_t alignment
);
Paramètres
size
Taille de l'allocation de mémoire demandée.
alignment
Valeur d'alignement, qui doit être un entier à puissance 2.
Valeur retournée
Pointeur vers le bloc de mémoire qui a été alloué ou NULL
si l'opération a échoué. Le pointeur est un multiple de alignment
.
Notes
_aligned_malloc
est basé sur malloc
.
_aligned_malloc
est marqué __declspec(noalias)
et __declspec(restrict)
, ce qui signifie que la fonction est garantie de ne pas modifier les variables globales et que le pointeur retourné n’est pas alias. Pour plus d’informations, consultez noalias
et restrict
.
Cette fonction affecte à errno
la valeur ENOMEM
si l'allocation de mémoire a échoué ou si la taille demandée était supérieure à _HEAP_MAXREQ
. Pour plus d’informations sur errno
, voir errno
, _doserrno
, , _sys_errlist
et _sys_nerr
. De plus, _aligned_malloc
valide ses paramètres. Si alignment
la puissance 2 n’est pas égale ou égale à size
zéro, cette fonction appelle le gestionnaire de paramètres non valide, comme décrit dans la validation des paramètres. Si l'exécution est autorisée à se poursuivre, cette fonction retourne NULL
et affecte la valeur errno
à EINVAL
.
Permet _aligned_free
de libérer la mémoire obtenue par les deux _aligned_malloc
et _aligned_offset_malloc
par . N’utilisez free
pas , qui ne récupère pas correctement la mémoire alignée et peut entraîner des bogues difficiles à diagnostiquer.
Par défaut, l’état global de cette fonction est limité à l’application. Pour modifier ce comportement, consultez État global dans le CRT.
Spécifications
Routine | En-tête C requis | En-tête C++ |
---|---|---|
_aligned_malloc |
<malloc.h> |
<cstdlib> |
Exemple
// crt_aligned_malloc.c
#include <malloc.h>
#include <stdio.h>
int main() {
void *ptr;
size_t alignment,
off_set;
// Note alignment should be 2^N where N is any positive int.
alignment = 16;
off_set = 5;
// Using _aligned_malloc
ptr = _aligned_malloc(100, alignment);
if (ptr == NULL)
{
printf_s( "Error allocation aligned memory.");
return -1;
}
if (((unsigned long long)ptr % alignment ) == 0)
printf_s( "This pointer, %p, is aligned on %zu\n",
ptr, alignment);
else
printf_s( "This pointer, %p, is not aligned on %zu\n",
ptr, alignment);
// Using _aligned_realloc
ptr = _aligned_realloc(ptr, 200, alignment);
if ( ((unsigned long long)ptr % alignment ) == 0)
printf_s( "This pointer, %p, is aligned on %zu\n",
ptr, alignment);
else
printf_s( "This pointer, %p, is not aligned on %zu\n",
ptr, alignment);
_aligned_free(ptr);
// Using _aligned_offset_malloc
ptr = _aligned_offset_malloc(200, alignment, off_set);
if (ptr == NULL)
{
printf_s( "Error allocation aligned offset memory.");
return -1;
}
if ( ( (((unsigned long long)ptr) + off_set) % alignment ) == 0)
printf_s( "This pointer, %p, is offset by %zu on alignment of %zu\n",
ptr, off_set, alignment);
else
printf_s( "This pointer, %p, does not satisfy offset %zu "
"and alignment %zu\n",ptr, off_set, alignment);
// Using _aligned_offset_realloc
ptr = _aligned_offset_realloc(ptr, 200, alignment, off_set);
if (ptr == NULL)
{
printf_s( "Error reallocation aligned offset memory.");
return -1;
}
if ( ( (((unsigned long long)ptr) + off_set) % alignment ) == 0)
printf_s( "This pointer, %p, is offset by %zu on alignment of %zu\n",
ptr, off_set, alignment);
else
printf_s( "This pointer, %p, does not satisfy offset %zu and "
"alignment %zu\n", ptr, off_set, alignment);
// Note that _aligned_free works for both _aligned_malloc
// and _aligned_offset_malloc. Using free is illegal.
_aligned_free(ptr);
}
This pointer, 3280880, is aligned on 16
This pointer, 3280880, is aligned on 16
This pointer, 3280891, is offset by 5 on alignment of 16
This pointer, 3280891, is offset by 5 on alignment of 16
Voir aussi
Commentaires
https://aka.ms/ContentUserFeedback.
Bientôt disponible : Tout au long de 2024, nous allons supprimer progressivement GitHub Issues comme mécanisme de commentaires pour le contenu et le remplacer par un nouveau système de commentaires. Pour plus d’informations, consultezEnvoyer et afficher des commentaires pour