2017-03-13 2 views
0

プレースメントnew演算子を使用してオブジェクトの配列を作成するにはどうすればよいですか? 私は他のSOの質問から単一のオブジェクトのためにそれを行う方法を知っています。 しかし、私はオブジェクトの配列を見つけることができませんでした。プレースメントnew演算子を使用してオブジェクトの配列を作成するにはどうすればよいですか?

パフォーマンスの違いを確認するには、オブジェクトの配列を作成し、サブループの後に削除しようとしています。しかし、私は道を見つけることができません。 複数のオブジェクトを作成するにはどうすればよいですか?

class Complex 
{ 
    double r; // Real Part 
    double c; // Complex Part 

    public: 
    Complex() : r(0), c(0) {} 
    Complex (double a, double b): r (a), c (b) {} 
    void *operator new(std::size_t size,void* buffer) 
    { 
     return buffer; 
    } 
}; 

char *buf = new char[sizeof(Complex)*1000]; // pre-allocated buffer 

int main(int argc, char* argv[]) 
{ 
    Complex* arr; 
    for (int i = 0;i < 200000; i++) { 
    //arr = new(buf) Complex(); This just create single object. 
    for (int j = 0; j < 1000; j++) { 
     //arr[j] = Now how do I assign values if only single obect is created? 
    } 
    arr->~Complex(); 
    } 
return 0; 
} 
+0

新しい(バフ)コンプレックス[1000]を試しましたか?のように、ちょうどそれに配列のサイズを追加しますか?ただし、配置配列newは、プラットフォームに依存した方法(ick)でより多くのスペースを必要とする可能性があるので、各要素*に新しいループ呼び出し配置を使用すると、移植性が向上します。第二に、なぜあなたは上記の 'operator new'をオーバーロードしていますか?新しいプレースメントを行うときに、ユーザー定義の演算子newを呼び出すという目標はありますか? – Yakk

+0

これは私が知りませんでした。私はこれを試してみる。また、パラメータ化されたコンストラクタでそれを作成することもできません。 – InQusitive

+0

http://www.sourcetricks.com/2008/05/c-placement-new.html#.WMbfiyGGPak私はこのリンクに従っていました。私は新しい配置のために新しいオペレータを過負荷にする必要があると思った。 – InQusitive

答えて

1

標準的に定義されたnew演算子をむしろ無駄な関数に優先させる目的は何ですか?そして、あなたはあなたがに配置新に基づく任意ののインフラストラクチャを設計しようとしている場合、あなたが最も可能性の高い構築するファクトリクラスを作成する必要があり

#include <iostream> 

class Complex 
{ 
    double r; // Real Part 
    double c; // Complex Part 

    public: 
    Complex() : r(0), c(0) {} 
    Complex (double a, double b): r (a), c (b) {} 
}; 

char *buf = new char[sizeof(Complex)*1000]; // pre-allocated buffer 

int main(int argc, char* argv[]) 
{ 
    // When doing this, it's _your_ problem 
    // that supplied storage is aligned proeperly and got 
    // enough storage space 

    // Create them all 
    // Complex* arr = new(buf) Complex[1000]; 

    Complex** arr = new Complex*[1000]; 
    for (int j = 0; j < 1000; j++)  
     arr[j] = new (buf + j*sizeof(Complex)) Complex; 

    for (int j = 0; j < 1000; j++) 
     arr[j]->~Complex(); 

    delete[] buf; 
    return 0; 
} 

一つ一つを作成し、店舗obejctsにしている場合、あなたが店のポインタを想定する方法RAIIを使用してバッファを制御します。そのようなクラス\パターンは一般にメモリプールと呼ばれます。私が今までに実践した唯一のプールは、そのようなオブジェクトへの参照を格納する特別なクラスを使用して、異なるサイズとタイプの配列とクラスを格納することでした。

+0

私はコメントなしで投票したのですか? – Swift

関連する問題