Skip to content

std::aligned_storage

stackoverflow Can std::byte replace std::aligned_storage?

cppreference std::aligned_storage

Possible implementation

Except for default argument, aligned_storage is expressible in terms of 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];
    };
};

Example

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

#include <iostream>
#include <type_traits>
#include <string>

template<class T, std::size_t N>
class static_vector
{
    // properly aligned uninitialized storage for N T's
    typename std::aligned_storage<sizeof(T), alignof(T)>::type data[N];
    std::size_t m_size = 0;

public:
    // Create an object in aligned storage
    template<typename ...Args>
    void emplace_back(Args &&... args)
    {
        if (m_size >= N) // possible error handling
            throw std::bad_alloc { };

        // construct value in memory of aligned storage
        // using inplace operator new
        new (&data[m_size]) T(std::forward<Args>(args)...); // placement new
        ++m_size;
    }

    // Access an object in aligned storage
    const T& operator[](std::size_t pos) const
    {
        // note: needs std::launder as of C++17
        return *reinterpret_cast<const T*>(&data[pos]);
    }

    // Delete objects from aligned storage
    ~static_vector()
    {
        for (std::size_t pos = 0; pos < m_size; ++pos)
        {
            // note: needs std::launder as of C++17
            reinterpret_cast<T*>(&data[pos])->~T(); // 手工调用destructor
        }
    }
};

int main()
{
    static_vector<std::string, 10> v1;
    v1.emplace_back(5, '*');
    v1.emplace_back(10, '*');
    std::cout << v1[0] << '\n' << v1[1] << '\n';
}
// g++ test.cpp --std=c++11 -pedantic -Wall -Wextra

非常好的例子。

aligned storage placement new

stackoverflow Placement new in std::aligned_storage?