2009-07-04 20 views
10

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に関するドキュメントのみが表示されますが、その使用状況はほとんどありません。

答えて

9

reinterpret_castの使用を除いて、それは私には大丈夫です。 (私は100%2番目のものではない)。

reinterpret_castの問題点は、キャスト結果を保証しないということです。結果を元のタイプにキャストすると、元の値が返されます。したがって、キャストの結果に同じビットパターンが含まれているか、同じアドレスを指しているという保証はありません。

は、私の知る限りでは、型T *にポインタxを鋳造するためのポータブルソリューションは、同じアドレスへのポインタを回すために保証されているにstatic_castのでvoid*から、static_cast<T*>(static_cast<void*>(x))です。

しかし、それはあなたの質問に接するだけです。 :)

+0

これは良い解決策です。 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

+3

ええ、再解釈が実際に問題になるコンパイラを知っています(そして、私はC++ 0xで期待どおりに動作させると思っています)が、標準によると、未定義の動作です。 static_castトリックはどんなポインタ型でも動作するはずです。 – jalf

+0

'テンプレート T pointer_cast(void * p){return static_cast (p); } '。これに加えて、constのオーバーロードバージョン( 'const void * p')は、いくつかの型を節約します。 Boostにも同様の機能があります。static_pointer_castとdynamic_pointer_castです。 –

関連する問題