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();
    }

他们是有效的程序吗?还有其他用例吗?
Google搜索仅产生有关aligned_storage的文档,但很少提供其用法。

最佳答案

好吧,除了您使用reinterpret_cast之外,对我来说还不错。 (我不确定第二个是100%)。
reinterpret_cast的问题在于,它不能保证转换结果,只有将结果转换回原始类型时,您才能获得原始值。因此,不能保证强制转换的结果将包含相同的位模式或指向相同的地址。

据我所知,将指针x转换为T *类型的可移植解决方案是static_cast<T*>(static_cast<void*>(x)),因为与static_cast之间的void*可以保证将指针指向相同的地址。

但这仅与您的问题成正比关系。 :)

关于c++ - aligned_storage的基本用途是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1082378/

10-11 21:53