Namespaces
Variants

aligned_alloc

From cppreference.net
헤더 파일에 정의됨 <stdlib.h>
void * aligned_alloc ( size_t alignment, size_t size ) ;
(C11 이후)

size 바이트의 초기화되지 않은 저장 공간을 할당하며, 그 정렬은 alignment 로 지정됩니다. size 매개변수는 alignment 의 정수 배수여야 합니다.

aligned_alloc 는 스레드 안전합니다: 이 함수는 인자를 통해 접근 가능한 메모리 위치만 접근하는 것처럼 동작하며, 정적 저장소는 접근하지 않습니다.

이전에 free , free_sized , 그리고 free_aligned_sized (C23부터) 또는 realloc 을 호출하여 메모리 영역을 해제하는 작업은 동기화됩니다 동일한 메모리 영역 전체 또는 일부를 할당하는 aligned_alloc 호출과. 이 동기화는 해제 함수에 의한 메모리 접근 이후, 그리고 aligned_alloc 에 의한 메모리 접근 이전에 발생합니다. 각 특정 메모리 영역에 대해 작동하는 모든 할당 및 해제 함수들은 단일 전체 순서를 가집니다.

목차

매개변수

alignment - 정렬 방식을 지정합니다. 구현체에서 지원하는 유효한 정렬이어야 합니다.
size - 할당할 바이트 수. alignment 의 정수 배수여야 합니다.

반환값

성공 시, 새로 할당된 메모리의 시작 포인터를 반환합니다. 메모리 누수를 방지하기 위해 반환된 포인터는 free 또는 realloc 으로 해제되어야 합니다.

실패 시, 널 포인터를 반환합니다.

참고 사항

size alignment 의 정수 배가 아니거나, 유효하지 않거나 구현에서 지원하지 않는 alignment 를 전달하면 함수가 실패하고 널 포인터를 반환합니다 (C11 출판본에서는 이 경우 미정의 동작으로 명시되었으나, DR460 에서 수정됨). 제한적인 정렬 경계에서 작은 객체를 할당할 수 있도록 크기 제한을 제거하는 것( alignas 와 유사)이 N2072 에서 제안되었습니다.

"구현에 의해 지원됨" 요구 사항의 예시로, POSIX 함수 posix_memalign 는 2의 거듭제곱이면서 alignment sizeof ( void * ) 의 배수인 모든 값을 수용하며, POSIX 기반 aligned_alloc 구현은 이 요구 사항을 상속합니다.

기본 정렬은 항상 지원됩니다. 만약 alignment 가 2의 거듭제곱이고 _Alignof ( max_align_t ) 보다 크지 않다면, aligned_alloc 은 단순히 malloc 을 호출할 수 있습니다.

일반적인 malloc 은 기본 정렬을 가진 모든 객체 타입에 적합하게 메모리를 정렬합니다. aligned_alloc SSE , 캐시 라인, 또는 VM 페이지 경계와 같은 초과 정렬 할당에 유용합니다.

이 함수는 Microsoft C 런타임 라이브러리에서 지원되지 않습니다. 왜냐하면 해당 라이브러리의 std::free 구현체가 모든 종류의 정렬된 할당을 처리할 수 없기 때문입니다. 대신 MS CRT는 _aligned_malloc ( _aligned_free 로 해제해야 함)을 제공합니다.

예제

#include <stdio.h>
#include <stdlib.h>
int main(void)
{
    int *p1 = malloc(10*sizeof *p1);
    printf("default-aligned addr:   %p\n", (void*)p1);
    free(p1);
    int *p2 = aligned_alloc(1024, 1024*sizeof *p2);
    printf("1024-byte aligned addr: %p\n", (void*)p2);
    free(p2);
}

가능한 출력:

default-aligned addr:   0x1e40c20
1024-byte aligned addr: 0x1e41000

참고문헌

  • C23 표준 (ISO/IEC 9899:2024):
  • 7.22.3.1 The aligned_alloc function (p: TBD)
  • C17 표준 (ISO/IEC 9899:2018):
  • 7.22.3.1 aligned_alloc 함수 (p: 253)
  • C11 표준 (ISO/IEC 9899:2011):
  • 7.22.3.1 aligned_alloc 함수 (p: 347-348)

참고 항목

C++ documentation for aligned_alloc