Namespaces
Variants

std:: aligned_alloc

From cppreference.net
< cpp ‎ | memory ‎ | c
Memory management library
( exposition only* )
Allocators
Uninitialized memory algorithms
Constrained uninitialized memory algorithms
Memory resources
Uninitialized storage (until C++20)
( until C++20* )
( until C++20* )
( until C++20* )

Garbage collector support (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
헤더 파일에 정의됨 <cstdlib>
void * aligned_alloc ( std:: size_t alignment, std:: size_t size ) ;
(C++17부터)

size 바이트의 초기화되지 않은 저장 공간을 할당하며, 이 공간의 정렬은 alignment 로 지정됩니다 ( 대상 영역에서 객체를 암시적으로 생성 합니다). size 매개변수는 alignment 의 정수 배수여야 합니다.

다음 함수들은 스레드 안전성을 갖추어야 합니다:

이러한 함수들 중 특정 저장 단위를 할당하거나 해제하는 호출은 단일 전체 순서로 발생하며, 각각의 이러한 해제 호출은 이 순서에서 다음 할당(존재하는 경우)에 happens-before 관계를 가집니다.

목차

매개변수

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

반환값

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

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

참고 사항

size alignment 의 정수 배가 아니거나, 유효하지 않거나 구현체에서 지원하지 않는 alignment 를 전달하면 함수가 실패하고 널 포인터를 반환합니다 (C11 초판에서는 이 경우 미정의 동작으로 명시되었으나, DR460 에서 수정되었습니다).

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

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

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

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

예제

#include <cstdio>
#include <cstdlib>
int main()
{
    int* p1 = static_cast<int*>(std::malloc(10 * sizeof *p1));
    std::printf("default-aligned address:   %p\n", static_cast<void*>(p1));
    std::free(p1);
    int* p2 = static_cast<int*>(std::aligned_alloc(1024, 1024));
    std::printf("1024-byte aligned address: %p\n", static_cast<void*>(p2));
    std::free(p2);
}

가능한 출력:

default-aligned address:   0x2221c20
1024-byte aligned address: 0x2222400

참고 항목

(since C++11) (deprecated in C++23)
주어진 크기의 타입들을 위한 초기화되지 않은 저장소로 사용하기 적합한 타입을 정의함
(클래스 템플릿)
C 문서 for aligned_alloc