gpt4 book ai didi

c++ - 如何使用 placement new 运算符创建对象数组?

转载 作者:行者123 更新时间:2023-11-28 01:51:46 26 4
gpt4 key购买 nike

如何使用 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;
}

最佳答案

将标准定义的新运算符覆盖为相当无用的函数的目的是什么?以及如果你一个一个地创建你应该如何存储指针

#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 创建一个工厂类来构造和存储对象并控制缓冲区。这样的类\模式通常被称为内存池。我见过的唯一实用的池实现是存储数组和不同大小和类型的类,使用特殊类来存储对此类对象的引用。

关于c++ - 如何使用 placement new 运算符创建对象数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42771709/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com