如果我有一个容器:
std::vector<T*> elements;
我可以使用placement new 来分配我的对象,以便所有对象都连续分配吗?这样我就可以做这样的事情:
size_t elementIndex = someRandomElement - elements[0];
someRandomeElement
随机元素来自哪里elements
,然后elementIndex
将存储正确的索引,someRandomElement
以便elements[elementIndex] == someRandomElement
这是我当前实现内存管理器所必需的。我有一个我今天能够完成的实现,但它要求元素(可以是体素、三角形或其他任何东西)具有 GetIndex() 和 SetIndex() 函数,以便当元素作为指针返回时,我可以找到elements
数组中元素的索引,这意味着我无法更改的任何元素(比如说 Ogre::Vector3)都无法使用管理器(在我的情况下,我需要它们使用它,因为它们正在碎片化记忆)。
我唯一的其他解决方案是拥有一个充当访问器并具有索引以及指向元素的指针的结构,尽管这会导致内存使用量增加(考虑到我现在正在处理 500 万个元素)。
注意:我今天发布了一个类似的问题,但那里的答案做出了一些完全违背我的要求的假设。其中一项要求是向量必须填充指向
T
否则大部分代码库需要更改的指针。其次,初始化超过 100,000 个(大约)元素会导致 bad_alloc 异常。每个元素的大小为 196 字节(我已设法将其减少到 132 字节)。