std:: aligned_alloc
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
헤더 파일에 정의됨
<cstdlib>
|
||
|
void
*
aligned_alloc
(
std::
size_t
alignment,
std::
size_t
size
)
;
|
(C++17부터) | |
size 바이트의 초기화되지 않은 저장 공간을 할당하며, 이 공간의 정렬은 alignment 로 지정됩니다 ( 대상 영역에서 객체를 암시적으로 생성 합니다). size 매개변수는 alignment 의 정수 배수여야 합니다.
다음 함수들은 스레드 안전성을 갖추어야 합니다:
- 라이브러리 버전의 operator new 와 operator delete
- 전역 operator new 와 operator delete 의 사용자 대체 버전
- std::calloc , std::malloc , std::realloc , std::aligned_alloc , std::free
이러한 함수들 중 특정 저장 단위를 할당하거나 해제하는 호출은 단일 전체 순서로 발생하며, 각각의 이러한 해제 호출은 이 순서에서 다음 할당(존재하는 경우)에 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
|
|