繁体   English   中英

C ++大量整数存储为long

[英]C++ huge array of ints stored as longs

我想创建一个整数数组x 128,000,000,它比C ++中的最大数组/ vector大小最大,如C ++中所示。

一种概念上的方法是将一对整数存储为long,其中前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。

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

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

Is there a max array length limit in C++? 您有两个限制,您的硬件大于2G吗? 第二个限制是最大整数类型,这对您而言很合适。 因为对于32位int,UINT_MAX大于128 * 18,000,000。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM