C ++庞大的整数数组存储为long

时间:2013-08-29 18:45:49

标签: c++ arrays vector long-integer

我想创建一个128 x 18,000,000的大量int,这比Is there a max array length limit in C++?中提供的C ++的最大数组/向量大小要大。

一种概念方法是将一对整数存储为长整数,其中前32位是第一个整数,最后32位是第二个整数。问题是我该怎么做?因为,每次我要使用包含long的整数时,我需要一些快速有效的东西。我该怎么做一个长的并把它拆分成两个?或者我如何存储2个整数?

原始分配:

int nof1=64;
int nof2=18000000;
int *hugeArray;
int size = 2 * nof1 * nof2;
hugeArray = new int[size];

我有16Gb的Ram和一个带有gcc的64位Ubuntu 12.04。所以,主内存不是问题。不过,我还可以访问具有相同操作系统的32GB PC,因此无需担心RAM。

任何建议将不胜感激。提前谢谢。

2 个答案:

答案 0 :(得分:2)

您是否意识到int的大小有限制吗?即,(在许多机器上)它保持在-2147483647和214748364(-2.1B到2.1B)之间的值。并且2 * 64 * 18000000是2304000000(2.3B),这太大了。因此,由于有符号整数溢出的未定义行为,该值可能会被静默截断为~156516352。这是我所看到的唯一问题。要在内存中保持这个大小,你必须使用不同的类型,我建议size_t,它被设计为在内存中保存对象的大小(方便吗?),你必须确定使用64位构建。

完成后,hugeArray = new int[size];仍可能失败,具体取决于操作系统和硬件的限制。如果发生这种情况,您必须重新设计程序以减少内存使用时间。

此外,int nof2=18,000,000;不正确,会创建数字18,并将其丢弃。创建八进制数零,并丢弃它。然后它创建另一个八进制数零,并将 分配给nof2。编写C ++时,不要在数字中加入逗号。

size_t nof1 = 64;
size_t nof2 = 18000000;
size_t size = 2 * nof1 * nof2;
std::vector<int> hugeArray(size);

对于原始问题:“128 x 18,000,000,其最大值大于C ++的最大数组/向量大小”;这种假设是错误的。您链接到的问题中的第一个答案是:“... limit ...由用于描述数组中索引的大小类型的限制设置”。在您的计算机上,WAAAAAAY大于INT_MAX。答案从未声称存在INT_MAX的限制。唯一的限制是size_t,其限制与硬件相同。唯一的时间size_t不够大,如果CPU无法处理那么大的数字。

答案 1 :(得分:0)

正如Is there a max array length limit in C++?中所述。你有两个限制,你有超过2G的硬件?第二个限制是最大的整数类型,在您的情况下很好。因为对于32位int,UINT_MAX大于128 * 18,000,000。