我有一个包含四个动态数组的类:
CObjA * objAArray;
CObjB * objBArray;
CObjC * objCArray;
CObjD * objDArray;
我初始化这样的:
objAArray = new CObjA[numObj];
objBArray = new CObjB[numObj];
objCArray = new CObjC[numObj];
objDArray = new CObjD[numObj];
问题在于这四个内存分配需要很长时间 - 如果我必须创建40个这样的对象,性能非常糟糕。
我的问题是:有没有办法用一个new
操作分配所有四个数组?
如果我创建一个新结构:
struct _arrays
{
CObjA objA;
CObjB objB;
CObjC objC;
CObjD objD;
};
并使用该结构的一个数组,我只需要使用一个new
:
_arrays * arr = new _arrays[numObj];
但是然后对象没有正确地放在内存中。他们在内存中CObjA1-CObjB1-CObjC1-CObjD1-CObjA2-CObjB2...
。而不是所有CObjA
个对象,而是所有CObjB
个对象,......
有没有办法使用一个new
但仍能获得对象的正确内存布局?
答案 0 :(得分:1)
您可以使用malloc的单个分配来实现您所需的功能,然后使用" placement new"用于在所需内存位置创建对象的语法。
答案 1 :(得分:1)
正如@RSahu在他对你的问题的评论中提到的,如果不是构造导致性能瓶颈的对象,那么我会感到惊讶,并且原始内存分配本身也是如此。也就是说,做一个你想要的方法就是分配一个char *
类型的数组,然后在你的数组中分配内存位置,如下所示:
char* allocations = new char[numObj * (sizeof(CObjA) + sizeof(CObjB) +
sizeof(CObjC) + sizeof(CObjD))];
CObjA * objAArray = reinterpret_cast<CObjA *>(allocations);
CObjB * objBArray = reinterpret_cast<CObjB *>(allocations + numObj * sizeof(CObjA));
CObjC * objCArray = reinterpret_cast<CObjC *>(allocations + numObj * (sizeof(CObjA)
+ sizeof(CObjB));
CObjD * objDArray = reinterpret_cast<CObjD *>(allocations + numObj * (sizeof(CObjA)
+ sizeof(CObjB)
+ sizeof(CObjC));
... //use arrays here
delete [] allocations; //deletes all allocations in one go