_aligned_malloc
Belirtilen hizalama sınırına bellek ayırır.
void * _aligned_malloc(
size_t size,
size_t alignment
);
size
İstenen bellek ayırma boyutu.alignment
2 Tamsayı gücünü olmalıdır hizalama değeri.
Ayrılmış olan bellek bloğu için bir işaretçi veya NULL , işlem başarısız oldu. İşaretçiyi bir katı olan alignment.
_aligned_mallocesas malloc.
_aligned_mallocişaretlenmiş __declspec(noalias) ve __declspec(restrict), işlev genel değişkenleri değiştirmek için garantili ve işaretçiyi verdiğini başka ad verilmiş değil. Daha fazla bilgi için bkz: noalias ve kısıtlamak.
Bu işlevi ayarlar errno için ENOMEM bellek ayırma başarısız olursa veya istenen boyuta büyük _HEAP_MAXREQ. errno hakkında daha fazla bilgi için, bkz. errno, _doserrno, _sys_errlist ve _sys_nerr. Ayrıca, _aligned_malloc kendi parametreleri doğrulama. alignment 2'nin üssü değil veya size sıfır, açıklandığı gibi bu işlevi geçersiz parametre işleyicisini çağırır Parametre doğrulama. Yürütülmesine devam etmek için izin verilip verilmediğini, bu işlev verir NULL ve errno için EINVAL.
Yordamı |
Gerekli başlık |
---|---|
_aligned_malloc |
<malloc.h> |
// 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 (((int)ptr % alignment ) == 0)
printf_s( "This pointer, %d, is aligned on %d\n",
ptr, alignment);
else
printf_s( "This pointer, %d, is not aligned on %d\n",
ptr, alignment);
// Using _aligned_realloc
ptr = _aligned_realloc(ptr, 200, alignment);
if ( ((int)ptr % alignment ) == 0)
printf_s( "This pointer, %d, is aligned on %d\n",
ptr, alignment);
else
printf_s( "This pointer, %d, is not aligned on %d\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 ( ( (((int)ptr) + off_set) % alignment ) == 0)
printf_s( "This pointer, %d, is offset by %d on alignment of %d\n",
ptr, off_set, alignment);
else
printf_s( "This pointer, %d, does not satisfy offset %d "
"and alignment %d\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 ( ( (((int)ptr) + off_set) % alignment ) == 0)
printf_s( "This pointer, %d, is offset by %d on alignment of %d\n",
ptr, off_set, alignment);
else
printf_s( "This pointer, %d, does not satisfy offset %d and "
"alignment %d\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);
}