Namespaces
Variants

std:: align

From cppreference.net
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)
헤더 파일에 정의됨 <memory>
void * align ( std:: size_t alignment,

std:: size_t size,
void * & ptr,

std:: size_t & space ) ;
(C++11부터)

주어진 포인터 ptr 에서 크기 space 의 버퍼를 가리킬 때, 지정된 alignment 로 정렬된 size 바이트 수에 대한 포인터를 반환하고 정렬에 사용된 바이트 수만큼 space 인수를 감소시킵니다. 첫 번째 정렬된 주소가 반환됩니다.

이 함수는 버퍼에 주어진 정렬(alignment)로 원하는 바이트 수를 맞출 수 있을 경우에만 포인터를 수정합니다. 버퍼가 너무 작으면 함수는 아무 작업도 수행하지 않고 nullptr 을 반환합니다.

동작은 alignment 가 2의 거듭제곱이 아닌 경우 정의되지 않습니다.

목차

매개변수

alignment - 원하는 정렬
size - 정렬할 저장소의 크기
ptr - 최소 space 바이트 이상의 연속 저장소(버퍼)에 대한 포인터
space - 작업을 수행할 버퍼의 크기

반환값

조정된 ptr 값, 또는 제공된 공간이 너무 작을 경우 널 포인터 값.

예제

서로 다른 타입의 객체를 메모리에 배치하기 위해 std::align 사용법을 보여줍니다.

#include <iostream>
#include <memory>
#include <new>
template<std::size_t N>
struct MyAllocator
{
    std::byte data[N];
    std::size_t sz{N};
    void* p{data};
    MyAllocator() = default;
    // Note: only well-defined for implicit-lifetime types
    template<typename T>
    T* implicit_aligned_alloc(std::size_t a = alignof(T))
    {
        if (std::align(a, sizeof(T), p, sz))
        {
            T* result = std::launder(reinterpret_cast<T*>(p));
            p = static_cast<std::byte*>(p) + sizeof(T);
            sz -= sizeof(T);
            return result;
        }
        return nullptr;
    }
};
int main()
{
    MyAllocator<64> a;
    std::cout << "allocated a.data at " << (void*)a.data
              << " (" << sizeof a.data << " bytes)\n";
    // Allocate a char
    if (char* p = a.implicit_aligned_alloc<char>())
    {
        *p = 'a';
        std::cout << "allocated a char at " << (void*)p << '\n';
    }
    // Allocate an int
    if (int* p = a.implicit_aligned_alloc<int>())
    {
        *p = 1;
        std::cout << "allocated an int at " << (void*)p << '\n';
    }
    // Allocate an int, aligned at a 32-byte boundary
    if (int* p = a.implicit_aligned_alloc<int>(32))
    {
        *p = 2;
        std::cout << "allocated an int at " << (void*)p << " (32-byte alignment)\n";
    }
}

가능한 출력:

allocated a.data at 0x7ffc654e8530 (64 bytes)
allocated a char at 0x7ffc654e8530
allocated an int at 0x7ffc654e8534
allocated an int at 0x7ffc654e8540 (32-byte alignment)

결함 보고서

다음의 동작 변경 결함 보고서들은 이전에 발표된 C++ 표준에 소급 적용되었습니다.

DR 적용 대상 게시된 동작 올바른 동작
LWG 2377 C++11 alignment 이 기본 정렬 값 또는 지원되는 확장 정렬 값이어야 함 2의 거듭제곱이기만 하면 됨

참고 항목

alignof (C++11) 타입의 정렬 요구 사항을 조회
(연산자)
alignas (C++11) 변수의 저장 공간이 특정 크기로 정렬되도록 지정
(지정자)
(C++11부터) (C++23에서 사용 중단)
주어진 크기의 타입들을 위한 초기화되지 않은 저장 공간으로 사용하기 적합한 타입을 정의
(클래스 템플릿)
컴파일러에게 포인터가 정렬되어 있음을 알림
(함수 템플릿)