memory_align
memory_align (std::align)
<memory> 헤더에 정의되어 있어요. 크기 space의 버퍼에 대한 포인터 ptr이 주어졌을 때, 지정된 정렬(alignment)에 맞춰 size 바이트만큼 정렬된 포인터를 돌려주고, 정렬에 사용된 바이트 수만큼 space를 줄여요. 첫 번째 정렬된 주소를 돌려줘요.
출처: cppreference
본문
void* align( std::size_t alignment,
std::size_t size,
void*& ptr,
std::size_t& space );
(C++11부터)
이 함수는 요구된 바이트 수를 지정된 정렬로 버퍼에 맞출 수 있을 때만 포인터를 수정해요. 버퍼가 너무 작으면 아무 것도 하지 않고 nullptr을 돌려줘요.
alignment가 2의 거듭제곱(power of two)이 아니면 동작은 미정의예요.
매개변수
alignment: 원하는 정렬size: 정렬할 저장 공간의 크기ptr: 최소space바이트의 연속 저장 공간(버퍼)에 대한 포인터space: 버퍼의 크기(함수가 줄여나감)
반환값
정렬을 맞출 수 있으면 버퍼 내 정렬된 첫 주소, 그렇지 않으면 nullptr.
이 함수는 커스텀 정렬 메모리 버퍼, 예를 들어 스택 위에 정렬된 저장 공간을 만들거나 할당자를 구현할 때 유용해요. 정렬된 공간을 얻은 뒤 대상 객체를 placement new로 구성할 수 있어요.
void* buf = ...; std::size_t space = ...;
void* p = buf;
if (std::align(alignof(T), sizeof(T), p, space)) {
T* t = ::new (p) T; // 정렬된 위치에 T 구성
}