aligned_storage简单学习-阿里云开发者社区

开发者社区> 开发与运维> 正文

aligned_storage简单学习

简介: #include #include #include /* template< std::size_t Len, std::size_t Align = default-alignment >struct::type aligned_storage; 相当于一个内建的POD类...
#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;
}

 

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享:
开发与运维
使用钉钉扫一扫加入圈子
+ 订阅

集结各类场景实战经验,助你开发运维畅行无忧

其他文章