使用一个' new'

时间:2015-09-28 19:51:14

标签: c++ arrays class dynamic

我有一个包含四个动态数组的类:

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但仍能获得对象的正确内存布局?

2 个答案:

答案 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