Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
Размещение памяти на указанной границе выравнивания.
Синтаксис
void * _aligned_malloc(
size_t size,
size_t alignment
);
Параметры
size
Размер запрошенного размещения памяти.
alignment
Значение выравнивания, которое должно быть целой степенью числа 2.
Возвращаемое значение
Указатель на выделенный блок памяти или значение NULL в случае сбоя операции. Указатель делится на alignment.
Замечания
Функция _aligned_malloc основана на функции malloc.
_aligned_malloc помечается __declspec(noalias) и __declspec(restrict)означает, что функция гарантированно не изменяет глобальные переменные и что возвращаемый указатель не является псевдонимом. Дополнительные сведения см. в разделах noalias и restrict.
Эта функция задает для errno значение ENOMEM в случае сбоя выделения памяти или если запрошенный размер был больше _HEAP_MAXREQ. Дополнительные сведения о , см. в errnoразделеerrno , _doserrno_sys_errlistи _sys_nerr. Кроме того, _aligned_malloc проверяет свои параметры. Если alignment значение равно 2 или size равно нулю, эта функция вызывает обработчик недопустимых параметров, как описано в разделе проверки параметров. Если продолжение выполнения разрешено, эта функция возвращает NULL и задает для errno значение EINVAL.
Используется _aligned_free для освобождения памяти, полученной обоими _aligned_malloc и _aligned_offset_malloc. Не используйте free, который не освобождает выровненную память правильно и может привести к сложной диагностике ошибок.
По умолчанию глобальное состояние этой функции ограничивается приложением. Чтобы изменить это поведение, см . статью "Глобальное состояние" в CRT.
Требования
| Маршрут | Обязательный заголовок C | Заголовок C++ |
|---|---|---|
_aligned_malloc |
<malloc.h> |
<cstdlib> |
Пример
// 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