1

我想创建一个巨大的整数数组 128 x 18,000,000,它比 C++ 的最大数组/向量大小最大,如 C++ 中是否存在最大数组长度限制?.

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

原始分配:

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。

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

4

2 回答 2

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++ 的最大数组/向量大小”;这个假设是错误的。您链接到的问题的第一个答案是:“......限制......由用于描述数组中索引的大小类型的限制设置”。在您的机器上,它比 .WAAAAAAY 大INT_MAX。答案从不声称存在INT_MAX. 唯一的限制是,它具有与硬件size_t相同的限制。唯一不够大的时间是如果 CPU 无法处理那么大的数字。size_t

于 2013-08-29T19:16:19.067 回答
0

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

于 2013-08-29T18:51:49.190 回答