c++中未初始化的类实例数组

C++ uninitialized array of class instances

本文关键字:实例 数组 初始化 c++      更新时间:2023-10-16

我一直在寻找,但找不到答案。是否有一种方法告诉new操作符不调用类构造函数?

MyObject* array = new MyObject[1000];

这将调用MyObject()一千次!我想自己填充分配的内存,不需要在构造函数中初始化任何信息。使用malloc()是不太和谐的c++代码。

MyObject* array = (MyObject*) malloc(sizeof(MyObject) * 1000);

malloc等价的c++是分配函数operator new。你可以这样使用:

MyObject* array = static_cast<MyObject*>(::operator new(sizeof(MyObject) * 1000));

你可以用new:

构造一个特定的对象
new (array + 0) MyObject();

0替换为您希望初始化的偏移量。

然而,我想知道你是否真的想自己做这个动态分配。也许std::map<int, MyObject>std::unordered_map<int, MyObject>更适合您,因此您可以在任何索引上创建MyObject

std::unordered_map<int, MyObject> m;
m[100]; // Default construct MyObject with key 100

确实,在c++代码中使用malloc并不是很和谐。但是malloc可以完全满足您的要求。所以恐怕你所要求的与c++也不太协调。我猜你得决定你喜欢用C还是c++编程。

我想你唯一的其他真正的选择是重写MyObject,使它没有任何构造函数,但这也不是真正的c++方式。

直接使用std::vector

std::vector<MyObject> v;
v.reserve(1000); // allocate raw memory
v.emplace_back(42); // construct in place

用于随机访问(这(基本上)是std::vector在内部做的):

typedef std::aligned_storage<sizeof(MyObject), std::alignment_of<MyObject>::value>::type Storage;
MyObject* myObjects(reinterpret_cast<MyObject*>(new Storage[1000]));
new (myObjects + 42) MyObject(/* ? */); // placement new
(*(myObjects + 42)).~MyObject();

你计时了吗?是不是花的时间太长了?这是否只在程序执行时发生一次,比如在开始时?首先确定它确实是一个问题。

你真的需要这样分配1000个对象吗?

除此之外,如果没有调用构造函数,对象将如何…构造?