aligned_storage简单学习

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

/*
template< std::size_t Len, std::size_t Align = default-alignment >struct::type aligned_storage;
相当于一个内建的POD类型他的大小是Size他的对齐方式是Align 
*/
template<class  T, std::size_t N>
class static_vector
{
    typename std::aligned_storage<sizeof(T), __alignof(T)>::type data[N];
    std::size_t m_size = 0;
public:

    //类似于vector的push_back,使用了变长模板参数
    //和placement new
    template<typename ...Args>
    void emplace_back(Args&&... args)
    {
        if (m_size >= N)
            throw std::bad_alloc{};
        new(data + m_size) T(std::forward<Args>(args)...);
        ++m_size;
    }
    const T & operator[](std::size_t pos) const
    {
        const T *  ret = reinterpret_cast<const T*>(data + pos);
        return *ret;
    }
    ~static_vector()
    {
        for (std::size_t pos = 0; pos < m_size; ++pos)
            reinterpret_cast<T*>(data + pos)->~T();
    }
};


int _tmain(int argc, _TCHAR* argv[])
{
    std::cout << __alignof(std::string) << std::endl;

    static_vector<std::string, 10> v1;
    v1.emplace_back(5, '*');
    v1.emplace_back(10, '*');

    std::cout << v1[0] << '\n' << v1[1] << '\n';
    return 0;
}

 

posted @ 2017-06-16 16:18  瓜蛋  阅读(2262)  评论(0编辑  收藏  举报