如何使用placement new运算符创建对象数组? 我知道如何从其他SO问题中为单个对象做这件事。 但我无法找到对象数组。
要查看性能差异,我试图创建一个对象数组并在子循环后删除。但我无法找到办法。 如何创建多个对象?
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 :(得分:2)
将标准定义的新运算符重写为无用功能的目的是什么?如果你逐个创建
,你想如何存储指针#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;
}
如果要根据placement new设计任何基础结构,您很可能需要使用RAII创建一个工厂类来构造和存储对象以及控制缓冲区。这种类\模式通常称为内存池。我见过的唯一实用的池是存储不同大小和类型的数组和类,使用特殊类来存储对这种对象的引用。