std :: tr1 :: aligned_storageの基本的な使い方は何ですか?それは、以下のようなデータ型Fooの自動メモリとして使用できますか?aligned_storageの基本的な使い方は何ですか?
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に関するドキュメントのみが表示されますが、その使用状況はほとんどありません。
これは良い解決策です。 static_castとvoid *との間のstatic_castはOKですが、static_castのような複数のstatic_castの場合も同様です。(static_cast (x))ここでxは型ですか? それから、私はより安全に感じるために、reinterpret_castの代わりに、2つのstatic_castとしてタイプXからタイプYへのすべてのキャストを置き換えます。 (私はGCC&MSVC 9のコンパイラはreinterpret_castのために何の害も及ぼしませんが、私は安全な側にいたいと思っています:) –
abir
ええ、再解釈が実際に問題になるコンパイラを知っています(そして、私はC++ 0xで期待どおりに動作させると思っています)が、標準によると、未定義の動作です。 static_castトリックはどんなポインタ型でも動作するはずです。 – jalf
'テンプレート T pointer_cast(void * p){return static_cast (p); } '。これに加えて、constのオーバーロードバージョン( 'const void * p')は、いくつかの型を節約します。 Boostにも同様の機能があります。static_pointer_castとdynamic_pointer_castです。 –