_aligned_malloc
Mengalokasikan memori pada batas perataan tertentu.
Sintaks
void * _aligned_malloc(
size_t size,
size_t alignment
);
Parameter
size
Ukuran alokasi memori yang diminta.
alignment
Nilai perataan, yang harus berupa kekuatan bilangan bulat 2.
Nilai hasil
Penunjuk ke blok memori yang dialokasikan atau NULL
jika operasi gagal. Penunjuk adalah kelipatan dari alignment
.
Keterangan
_aligned_malloc
didasarkan pada malloc
.
_aligned_malloc
ditandai __declspec(noalias)
dan __declspec(restrict)
, yang berarti bahwa fungsi dijamin tidak memodifikasi variabel global dan bahwa penunjuk yang dikembalikan tidak diberi alias. Untuk informasi lebih lanjut, lihat noalias
dan restrict
.
Fungsi ini diatur errno
ke ENOMEM
jika alokasi memori gagal atau jika ukuran yang diminta lebih besar dari _HEAP_MAXREQ
. Untuk informasi selengkapnya tentang errno
, lihat errno
, , _sys_errlist
_doserrno
, dan _sys_nerr
. Selain itu, _aligned_malloc
memvalidasi parameternya. Jika alignment
bukan kekuatan 2 atau size
nol, fungsi ini memanggil handler parameter yang tidak valid, seperti yang dijelaskan dalam Validasi parameter. Jika eksekusi diizinkan untuk melanjutkan, fungsi ini mengembalikan NULL
dan mengatur errno
ke EINVAL
.
Gunakan _aligned_free
untuk membatalkan alokasi memori yang diperoleh oleh dan _aligned_malloc
_aligned_offset_malloc
. Jangan gunakan free
, yang tidak mengklaim kembali memori yang selaras dengan benar dan dapat menyebabkan bug yang sulit didiagnosis.
Secara default, status global fungsi ini dicakup ke aplikasi. Untuk mengubah perilaku ini, lihat Status global di CRT.
Persyaratan
Rutin | Header C yang diperlukan | Header C++ |
---|---|---|
_aligned_malloc |
<malloc.h> |
<cstdlib> |
Contoh
// 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