_aligned_malloc

Belirtilen hizalama sınırına bellek ayırır.

void * _aligned_malloc(
    size_t size, 
    size_t alignment
);

Parametreler

  • size
    İstenen bellek ayırma boyutu.

  • alignment
    2 Tamsayı gücünü olmalıdır hizalama değeri.

Dönüş 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.

Notlar

_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, and _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.

Gereksinimler

Yordamı

Gerekli başlık

_aligned_malloc

<malloc.h>

Örnek

// 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);
}
  

Ayrıca bkz.

Başvuru

Veri Hizalama