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的文档,但关于它的使用情况却很少。
答案 0 :(得分:9)
嗯,除了你使用reinterpret_cast
之外,它看起来还不错。 (我对第二个问题不是100%肯定的。)
reinterpret_cast
的问题在于它不保证转换的结果,只是如果将结果转换回原始类型,则得到原始值。因此,无法保证转换的结果将包含相同的位模式,或指向相同的地址。
据我所知,用于将指针x转换为类型T *的可移植解决方案是static_cast<T*>(static_cast<void*>(x))
,因为来自static_cast
的{{1}}保证转向指针相同的地址。
但这与你的问题只是切线相关。 :)