_aligned_malloc
Przydziela pamięć na określonej granicy wyrównania.
Składnia
void * _aligned_malloc(
size_t size,
size_t alignment
);
Parametry
size
Rozmiar żądanej alokacji pamięci.
alignment
Wartość wyrównania, która musi być całkowitą potęgą liczby 2.
Wartość zwracana
Wskaźnik do bloku pamięci, który został przydzielony lub NULL
jeśli operacja nie powiodła się. Wskaźnik to wielokrotność alignment
.
Uwagi
_aligned_malloc
jest oparty na .malloc
_aligned_malloc
jest oznaczony __declspec(noalias)
i __declspec(restrict)
, co oznacza, że funkcja nie ma gwarancji, aby nie modyfikować zmiennych globalnych i że zwrócony wskaźnik nie jest aliasowany. Aby uzyskać więcej informacji, zobacz tematy noalias
oraz restrict
.
Ta funkcja ustawia errno
na ENOMEM
jeśli alokacja pamięci nie powiodła się lub jeśli żądany rozmiar był większy niż _HEAP_MAXREQ
. Aby uzyskać więcej informacji na temat errno
programu , zobaczerrno
, _doserrno
, _sys_errlist
i _sys_nerr
. _aligned_malloc
Ponadto weryfikuje jego parametry. Jeśli alignment
nie jest mocą 2 lub size
ma wartość zero, ta funkcja wywołuje nieprawidłową procedurę obsługi parametrów, zgodnie z opisem w temacie Weryfikacja parametrów. Jeśli wykonanie jest dozwolone do kontynuowania, ta funkcja zwraca NULL
i ustawia wartość errno
.EINVAL
Użyj _aligned_free
polecenia , aby cofnąć przydział pamięci uzyskanej przez elementy i _aligned_malloc
_aligned_offset_malloc
. Nie używaj elementu free
, który nie odzyskuje prawidłowo wyrównanej pamięci i może prowadzić do trudnej do zdiagnozowania usterek.
Domyślnie stan globalny tej funkcji jest zakresem aplikacji. Aby zmienić to zachowanie, zobacz Stan globalny w CRT.
Wymagania
Procedura | Wymagany nagłówek języka C | Nagłówek języka C++ |
---|---|---|
_aligned_malloc |
<malloc.h> |
<cstdlib> |
Przykład
// 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