Namespaces
Variants

std:: aligned_storage

From cppreference.net
Metaprogramming library
Type traits
Type categories
(C++11)
(C++11) ( DR* )
Type properties
(C++11)
(C++11)
(C++14)
(C++11) (deprecated in C++26)
(C++11) ( until C++20* )
(C++11) (deprecated in C++20)
(C++11)
Type trait constants
Metafunctions
(C++17)
Supported operations
Relationships and property queries
Type modifications
Type transformations
aligned_storage
(C++11) (deprecated in C++23)
(C++11) (deprecated in C++23)
(C++11)
(C++11) ( until C++20* ) (C++17)

Compile-time rational arithmetic
Compile-time integer sequences
헤더에 정의됨 <type_traits>
template < std:: size_t Len, std:: size_t Align = /* default-alignment */ >
struct aligned_storage ;
(C++11부터)
(C++23부터 사용 중단됨)

중첩 타입 type 을 제공하며, 이는 TrivialType StandardLayoutType 요구사항을 만족하며, 크기가 최대 Len 이고 정렬 요구사항 Align 의 약수인 모든 객체에 대한 초기화되지 않은 저장소로 사용하기에 적합합니다.

Align 의 기본값은 크기가 Len 이하인 모든 객체에 대해 가장 엄격한(가장 큰) 정렬 요구 사항입니다. 기본값을 사용하지 않는 경우, Align 은 반드시 어떤 타입 T 에 대한 alignof ( T ) 값이어야 하며, 그렇지 않으면 동작이 정의되지 않습니다.

Len == 0 인 경우의 동작은 정의되지 않습니다.

확장된 정렬(extended alignment)이 지원되는지 여부는 구현에 따라 정의됩니다.

프로그램이 std::aligned_storage 에 대한 특수화를 추가하는 경우, 동작은 정의되지 않습니다.

목차

멤버 타입

이름 정의
type 최소 크기 Len 과 정렬 요구사항 Align 을 갖는 trivial 이면서 standard-layout 타입

헬퍼 타입

template < std:: size_t Len, std:: size_t Align = /* 기본 정렬 */ >
using aligned_storage_t = typename aligned_storage < Len, Align > :: type ;
(C++14부터)
(C++23에서 사용 중단됨)

참고 사항

std::aligned_storage<>::type 으로 정의된 타입은 주어진 타입의 객체를 보관하기에 적합한 초기화되지 않은 메모리 블록을 생성하는 데 사용될 수 있으며, 필요에 따라 캐시 또는 페이지 경계와 같이 객체의 자연 정렬 요구사항보다 더 엄격하게 정렬될 수 있습니다.

다른 초기화되지 않은 저장소와 마찬가지로, 객체들은 placement new 를 사용하여 생성되고 명시적 소멸자 호출로 파괴됩니다.

가능한 구현

기본 인자를 제외하고, aligned_storage는 alignas를 사용하여 표현 가능합니다:

template<std::size_t Len, std::size_t Align = /* default alignment not implemented */>
struct aligned_storage
{
    struct type
    {
        alignas(Align) unsigned char data[Len];
    };
};

예제

정렬된 저장소에서 객체의 생성, 접근, 소멸을 보여주는 기본적인 정적 벡터 클래스입니다.

#include <cstddef>
#include <iostream>
#include <new>
#include <string>
#include <type_traits>
template<class T, std::size_t N>
class static_vector
{
    // N개의 T 객체를 위한 적절히 정렬된 초기화되지 않은 저장소
    std::aligned_storage_t<sizeof(T), alignof(T)> data[N];
    std::size_t m_size = 0;
public:
    // 정렬된 저장소에 객체 생성
    template<typename ...Args> void emplace_back(Args&&... args)
    {
        if (m_size >= N) // 가능한 오류 처리
            throw std::bad_alloc{};
        // 인플레이스 operator new를 사용하여 정렬된 저장소 메모리에 값 생성
        ::new(&data[m_size]) T(std::forward<Args>(args)...);
        ++m_size;
    }
    // 정렬된 저장소의 객체에 접근
    const T& operator[](std::size_t pos) const
    {
        // 참고: P0137R1에서 객체 모델 변경 후 std::launder가 필요함
        return *std::launder(reinterpret_cast<const T*>(&data[pos]));
    }
    // 정렬된 저장소에서 객체 소멸
    ~static_vector()
    {
        for (std::size_t pos = 0; pos < m_size; ++pos)
            // 참고: P0137R1에서 객체 모델 변경 후 std::launder가 필요함
            std::destroy_at(std::launder(reinterpret_cast<T*>(&data[pos])));
    }
};
int main()
{
    static_vector<std::string, 10> v1;
    v1.emplace_back(5, '*');
    v1.emplace_back(10, '*');
    std::cout << v1[0] << '\n' << v1[1] << '\n';
}

출력:

*****
**********

참고 항목

alignas (C++11) 변수의 저장 공간이 특정 크기로 정렬되도록 지정함
(지정자)
타입의 정렬 요구사항을 얻음
(클래스 템플릿)
정렬된 메모리를 할당함
(함수)
(C++11부터) (C++23에서 사용 중단됨)
주어진 모든 타입에 대해 초기화되지 않은 저장 공간으로 사용하기 적합한 타입을 정의함
(클래스 템플릿)
다른 모든 스칼라 타입만큼 큰 정렬 요구사항을 가진 트리비얼 타입
(타입 정의)
(C++17)
포인터 최적화 장벽
(함수 템플릿)