プレースメント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;
}
新しい(バフ)コンプレックス[1000]を試しましたか?のように、ちょうどそれに配列のサイズを追加しますか?ただし、配置配列newは、プラットフォームに依存した方法(ick)でより多くのスペースを必要とする可能性があるので、各要素*に新しいループ呼び出し配置を使用すると、移植性が向上します。第二に、なぜあなたは上記の 'operator new'をオーバーロードしていますか?新しいプレースメントを行うときに、ユーザー定義の演算子newを呼び出すという目標はありますか? – Yakk
これは私が知りませんでした。私はこれを試してみる。また、パラメータ化されたコンストラクタでそれを作成することもできません。 – InQusitive
http://www.sourcetricks.com/2008/05/c-placement-new.html#.WMbfiyGGPak私はこのリンクに従っていました。私は新しい配置のために新しいオペレータを過負荷にする必要があると思った。 – InQusitive