Udostępnij za pośrednictwem


_aligned_malloc

Przydziela pamięć na określonej granicy wyrównania.

Składnia

void * _aligned_malloc(
    size_t size,
    size_t alignment
);

Parametry

size
Rozmiar żądanej alokacji pamięci.

alignment
Wartość wyrównania, która musi być całkowitą potęgą liczby 2.

Wartość zwracana

Wskaźnik do bloku pamięci, który został przydzielony lub NULL jeśli operacja nie powiodła się. Wskaźnik to wielokrotność alignment.

Uwagi

_aligned_mallocjest oparty na .malloc

_aligned_malloc jest oznaczony __declspec(noalias) i __declspec(restrict), co oznacza, że funkcja nie ma gwarancji, aby nie modyfikować zmiennych globalnych i że zwrócony wskaźnik nie jest aliasowany. Aby uzyskać więcej informacji, zobacz tematy noalias oraz restrict.

Ta funkcja ustawia errno na ENOMEM jeśli alokacja pamięci nie powiodła się lub jeśli żądany rozmiar był większy niż _HEAP_MAXREQ. Aby uzyskać więcej informacji na temat errnoprogramu , zobaczerrno , _doserrno, _sys_errlisti _sys_nerr. _aligned_malloc Ponadto weryfikuje jego parametry. Jeśli alignment nie jest mocą 2 lub size ma wartość zero, ta funkcja wywołuje nieprawidłową procedurę obsługi parametrów, zgodnie z opisem w temacie Weryfikacja parametrów. Jeśli wykonanie jest dozwolone do kontynuowania, ta funkcja zwraca NULL i ustawia wartość errno .EINVAL

Użyj _aligned_free polecenia , aby cofnąć przydział pamięci uzyskanej przez elementy i _aligned_malloc _aligned_offset_malloc. Nie używaj elementu free, który nie odzyskuje prawidłowo wyrównanej pamięci i może prowadzić do trudnej do zdiagnozowania usterek.

Domyślnie stan globalny tej funkcji jest zakresem aplikacji. Aby zmienić to zachowanie, zobacz Stan globalny w CRT.

Wymagania

Procedura Wymagany nagłówek języka C Nagłówek języka C++
_aligned_malloc <malloc.h> <cstdlib>

Przykład

// 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

Zobacz też

Wyrównanie danych