aligned_storage的基本用法是什么?

时间:2009-07-04 15:13:48

标签: c++

std :: tr1 :: aligned_storage的基本用法是什么?它可以用作数据类型Foo的自动存储器,如下所示吗?

   struct Foo{...};
   std::tr1::aligned_storage<sizeof(Foo)
        ,std::tr1::alignment_of<Foo>::value >::type buf;
   Foo* f = new (reinterpret_cast<void*>(&buf)) Foo();
   f->~Foo();

如果是这样,那么如何在buf中存储多个Foo,

    std::tr1::aligned_storage<5*sizeof(Foo)
            ,std::tr1::alignment_of<Foo>::value >::type buf;
    Foo* p = reinterpret_cast<Foo*>(&buf);
    for(int i = 0; i!= 5; ++i,++p)
    {
        Foo* f = new (p) Foo();
    }

它们是有效的程序吗?它还有其他用例吗? 谷歌搜索仅产生有关aligned_storage的文档,但关于它的使用情况却很少。

1 个答案:

答案 0 :(得分:9)

嗯,除了你使用reinterpret_cast之外,它看起来还不错。 (我对第二个问题不是100%肯定的。)

reinterpret_cast的问题在于它不保证转换的结果,只是如果将结果转换回原始类型,则得到原始值。因此,无法保证转换的结果将包含相同的位模式,或指向相同的地址。

据我所知,用于将指针x转换为类型T *的可移植解决方案是static_cast<T*>(static_cast<void*>(x)),因为来自static_cast的{​​{1}}保证转向指针相同的地址。

但这与你的问题只是切线相关。 :)