gpt4 book ai didi

C++ 巨大的整数数组存储为长整数

转载 作者:行者123 更新时间:2023-11-30 04:15:09 25 4
gpt4 key购买 nike

我想创建一个 128 x 18,000,000 的巨大整数数组,它比 Is there a max array length limit in C++? 中提供的 C++ 的最大数组/vector 大小最大。 .

一种概念上的方法是将一对 int 存储为 long,其中前 32 位是第一个整数,后 32 位是第二个整数。问题是我该怎么做?因为,每次我要使用包含长整数的两个整数时,我都需要一些快速高效的东西。如何将一个 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。

如有任何建议,我们将不胜感激。提前致谢。

最佳答案

你确实意识到 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,并将其丢弃。创建八进制数零,并将其丢弃。然后它创建另一个八进制数零,并将 that 分配给 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++ 的最大数组/vector 大小还大”;这个假设是错误的。您链接到的问题中的第一个答案是:“......限制......由用于描述数组中索引的大小类型的限制设置”。在您的机器上,它比 INT_MAX 大 WAAAAAAY。答案从不声称存在 INT_MAX 的限制。唯一的限制是 size_t,它与 硬件 具有相同的限制。 size_t 不够大的唯一情况是 CPU 无法处理那么大的数字。

关于C++ 巨大的整数数组存储为长整数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18518781/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com