gpt4 book ai didi

c++ - 用一个 'new' 分配四个对象数组

转载 作者:行者123 更新时间:2023-11-28 02:20:07 24 4
gpt4 key购买 nike

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

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'000 个对象,性能会非常糟糕。

我的问题是:有没有一种方法可以通过一次 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 但仍然获得对象的正确内存布局?

最佳答案

正如@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

关于c++ - 用一个 'new' 分配四个对象数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32830694/

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