std::aligned_storage

From Cppreference

Jump to: navigation, search
Defined in header <type_traits>

template< std::size_t Len, std::size_t Align = default-alignment >
struct aligned_storage;
(C++11 feature)

Provides the member typedef type, which is a POD type suitable for use as uninitialized storage for any object whose size is at most Len and whose alignment requirement is a divisor of Align. The default value of Align is the most stringent (the largest) alignment requirement for any object whose size is at most Len.

Contents

[edit] Member types

Name Definition
type the POD type of size Len with alignment requirement Align

[edit] Notes

The type defined by std::aligned_storage can be used to create uninitialized memory blocks suitable to hold the objects of given type, optionally aligned stricter than necessary, for example on a cache or page boundary.

[edit] Equivalent definition

Except for default argument, aligned_storage is expressible in terms of alignas:

[edit] Example

A primitive static vector class, demonstrating creation, access, and destruction of objects in aligned storage

#include <iostream>
#include <type_traits>
#include <string>
 
template<typename T, std::size_t N>
class static_vector
{
    // propertly aligned uninitialized storage for N T's
    typename std::aligned_storage <sizeof(T), std::alignment_of<T>::value>::type data[N];
    std::size_t m_size;
public:
 
    static_vector() : m_size(0) {};
    // Create an object in aligned storage
    template<typename ...Args> void emplace_back(Args&&... args) 
    {
        new(data+m_size) T(std::forward<Args>(args)...);
        m_size++; // bounds check omitted
    }
 
    // Access an object in aligned storage
    const T& operator[](size_t pos) const 
    {
        return reinterpret_cast<const T&>(data[pos]);
    }
    // Delete objects from aligned storage
    ~static_vector() 
    {
        for(std::size_t pos = 0; pos < m_size; ++pos) {
            reinterpret_cast<const T*>(data+pos)->~T();
        }
    }
};
 
int main()
{
    static_vector<std::string, 10> v1;
    v1.emplace_back(std::string(5, '*'));
    v1.emplace_back(std::string(10, '*'));
    std::cout << v1[0] << '\n' << v1[1] << '\n';
}

Output:

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

[edit] See also

alignas
(keyword)
alignment_of (C++11)
obtains the type's alignment requirements
(class template)
aligned_union (C++11)
defines the type suitable for use as uninitialized storage for all given types
(class template)
max_align_t (C++11)
POD type with alignment requirement as great as any other scalar type
(typedef)