2012-03-15 2 views
0

動的に割り当てられたオブジェクトをヒープ以外の場所に置くことはできますか?そのためのオーバーロードされた新しい演算子をどのように定義しますか?オブジェクトをヒープ以外の場所に配置する方法はありますか?

私は

class Arena{ 
     char area[2000]; 
public: 
     Arena(){} 
}; 

アリーナmy_arena(1000)のようないくつかのクラスのアリーナを持っている場合は、など、パフォーマンス上のヒープから割り当てと比較して

そして、私はアリーナのmy_arenaからオブジェクトを割り当てたい...さらに

、そのようなメモリ割り当てで可能な欠点は何ですか?

+0

なぜそうしたいですか? – Anycorn

+0

ヒープを特定のサイズにしたい。 – bhuwansahni

+3

[placement new()](http://stackoverflow.com/questions/222557/cs-placement-new)。 – iammilind

答えて

5

MyClass* p = new (area) MyClass; 

あなたはしかし、に注意する必要があり二つの問題があります。

  1. はarea`がなる `という保証はありません`MyClass`のために正しく調整されました。私は通常、組合によってこれを解決します:
     
        union 
        { 
         double dummyForAlignment; 
         // Any other types which might be necessary... 
         unsigned char area[2000]; 
        }; 
    
    これは非常に特別です。 のタイプを確認するために追加しなければならない正式な保証はありません。実際には、 `double`の代わりに、ほとんどの基本型の組合 と、いくつかのポインタを使用しています。
  2. 通常のデータメンバーと同じように、newを使用しているため、コンパイラは の破壊を処理しません。
     
        p->~MyClass(); 
    
    これは、 のオブジェクトの数、およびwhereが割り当てられているオブジェクトの数を追跡する必要があることを意味します。

この手法の欠点は、私がちょうど述べた2つの点です。 さらに、構築されたオブジェクトへの型付きポインタを保持しない限り、 はデバッガで表示する際に問題が発生することがあります。 それでも、それはいくつかの特定の用途には便利なテクニックです:私は Fallibleクラスでそれを使用して、デフォルトのコンストラクタの必要を避けます。 標準コンテナにはそれが必要であり、当然のことながら、事前標準ベクトルまたは 配列クラスでも同様に使用されます。これは様々な バリアントクラスにも便利です。例えば、boost::variantで使われていると思います。

+0

私の投稿の意味を変更する編集内容は何ですか?私はスペルを修正する人には問題がありません(私は悪いスペルラーです)、属していない単語を追加した編集があり、その答えがあまり正確ではありませんでした。 (私は自分自身の編集で編集を元に戻しました。) –

0

単純にオーバーロード演算子new &を削除し、スタック上の変数/クラスを宣言することができます。

静的プールを静的に管理できるように、ある種の静的プールを使用したいと思うかもしれません。

あなたは簡単にこのための新しい配置を使用することができます
1

可能ですが、低レベルです。

ジェームズは適切にC++ 03をカバーしていますので、代替案を提示してください。

  • Boost.Optional:あなたはブーストを持つ2つの選択肢を持っているC++ 03に

    まず、名前が示すようにboost::optional<MyClass>はあなたが持っている(またはしない)ことを可能にするタイプのインスタンス。

  • Boost.Variantboost::variant<SomeClass,OtherClass,YetAnotherClass>unionの種類であり、タイプセキュアセマンティクスと保証されたコンストラクタ/デストラクタコールがあります。 C++ 11に

第二は、2つのパラメータをとりstd::aligned_storage<Len,Align>を導入した:

  • アライメントが必要
  • 必要なストレージのバイト数は、

暗くコンパイラを使用しますマジックを使用して、アラインメントが満たされていることを保証します。したがって、RAWメモリー操作ルーチンを構築するための良い基礎となります。

個人的に私はあなたのケースでboost::optionalを選ぶでしょう:

boost::optional<MyClass> Arena[256]; 

このモデルをデフォルトboost::optionalをインスタンス化されるので、正確に何をしたいです。

関連する問題