Bagikan melalui


_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

Lihat juga

Perataan data