std:: aligned_storage
| Type traits | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Compile-time rational arithmetic | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Compile-time integer sequences | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
(C++14)
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
헤더에 정의됨
<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++17)
|
정렬된 메모리를 할당함
(함수) |
|
(C++11부터)
(C++23에서 사용 중단됨)
|
주어진 모든 타입에 대해 초기화되지 않은 저장 공간으로 사용하기 적합한 타입을 정의함
(클래스 템플릿) |
|
(C++11)
|
다른 모든 스칼라 타입만큼 큰 정렬 요구사항을 가진 트리비얼 타입
(타입 정의) |
|
(C++17)
|
포인터 최적화 장벽
(함수 템플릿) |