c++中未初始化的类实例数组
C++ uninitialized array of class instances
我一直在寻找,但找不到答案。是否有一种方法告诉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个对象吗?
除此之外,如果没有调用构造函数,对象将如何…构造?
相关文章:
- 为什么静态数组成员变量在调用对象的实例后不显示任何内容?
- 如何在模板函数中实例化其长度使用模板参数的数组
- 从函数中全局删除并重新实例化数组结构,而无需在编译时知道数组的大小
- 我可以初始化 const 实例,以便我可以将其用作 const 来初始化数组吗?
- 结构数组的构造函数错误,错误消息:没有构造函数实例与参数列表匹配
- 有没有办法根据命令行参数定义数组大小?运行时与编译时实例化?
- 如何为包含另一个类实例的数组制作常量 getter?
- 是否允许使用初始值设定项列表将const数组引用实例化为构造函数参数
- 如何创建具有不同字符数组的多个类实例?
- 包含不同大小静态数组的类的多个实例
- 如何在C++中动态分配全局字符数组中的类实例?
- 我可以从initializer_list实例化数组吗?
- 在 C++ 结构内声明的数组 A[1] 创建多个实例
- std::在类包装器实例化时设置的数组大小
- 如何通过循环访问数组来读取和存储实例的值?
- 分割故障 - 遇到问题,创建新的数组实例
- 无法用const char *数组实例化模板
- 数组、构造函数和实例
- 类C++的静态(单实例)数组
- 将2D数组的实例分配给3D数组中的索引