【发布时间】:2011-04-21 17:12:38
【问题描述】:
我目前正在填充元素的向量数组,如下所示:
std::vector<T*> elemArray;
for (size_t i = 0; i < elemArray.size(); ++i)
{
elemArray = new T();
}
代码显然已经被简化了。现在在询问另一个question(与此问题无关但与程序相关)后,我意识到我需要一个包含new'd 对象的数组(不能在堆栈上,会溢出,元素太多)但是连续的。也就是说,如果我要接收一个没有数组索引的元素,我应该能够通过执行returnedElement - elemArray[0] 来找到数组索引以获取数组中元素的索引。
我希望我已经解释了问题,如果没有,请告诉我哪些部分,我会尝试澄清。
编辑:我不确定为什么没有调查最高投票的答案。我已经试过很多次了。如果我尝试使用超过 100,000 个(大约)元素分配这样的向量,它总是会给我一个内存错误。其次,我需要指针,从我的示例中可以清楚地看出。突然把它改成不是指针需要大量的代码重写(虽然我愿意这样做,但它仍然没有解决像这样用几百万个元素分配向量不起作用的问题。
【问题讨论】:
-
如果您希望 objects 是连续的并且您希望其中有 100000 个,那么您可能会用完地址空间。您的对象有多大,您使用的是 64 位平台吗?
-
虽然我的系统是 64 位,但程序是用 32 位编译的。对象大小为 192 字节,这应该不是问题(大约 20mb 的连续内存)。我有 8GB 的系统 RAM。
-
您可能会感到惊讶,您是否尝试过在程序运行时映射其地址空间?另外,我不太了解您的“我需要指针”要求。如果你有一个连续的元素块,那么构造一个指向任何元素的指针是微不足道的。也许您可以发布一些澄清代码?
-
@Charles:是的,这很简单,但是有很多代码假设容器中充满了需要更改的指针。
-
@Samaursa:如果你在 Windows 上,你可以尝试类似Address Space Monitor (其他工具可用),它以图形方式显示地址空间并显示最大连续空闲区域的大小空间。如果你在 linux 上,你可以
cat /proc/self/maps.