使用微小单元声明一个巨大的动态数组[C++]

Uri*_*nam 2 c++ memory arrays dynamic-arrays

我有这个项目,我正在努力.以下条件适用

  1. 在这个项目中,我需要创建一个巨大的数组(希望我能够创建一个大到~7.13e + 17,但这个目标仍然领先.)
  2. 数组中的每个单元格都可以包含三个值中的一个:0,1,2
  3. 我正在使用C++作为我的语言.

我尝试使用普通的动态数组命令

int * p;
int i;    
i=[size]; //This is calculated somewhere else.
p= new (nothrow) int[i];
Run Code Online (Sandbox Code Playgroud)

但据我所知,这个数组使得一个数组的最大大小可能是int的最大值.如果我更改我的代码并使用以下代码

long long * p;
long long i;    
i=[size]; //This is calculated somewhere else.
p= new (nothrow) long long [i];
Run Code Online (Sandbox Code Playgroud)

然后,阵列中的每个单元格都是"long long"类型,这使得阵列非常重.有没有办法用long long来创建一个数组来确定数组中的单元格数,并且每个单元格的大小为int?

非常感谢,Uriel.

编辑:了解更多信息.

  1. 这个问题主要是理论上的,它是我硕士论文的一部分.我仍然希望这个程序尽可能地发挥作用.
  2. 我目前的步骤是使这个工作用于2.56e + 09项目的数组,快速计算显示我们正在谈论一个至少0.6千兆字节的数组,这是我的系统应该能够应付的.然而,即使所需的空间量确实达到4.5GB,我也无法用我当前的编码解决方案实现这一目标.

The*_*ish 7

有没有办法用long long来创建一个数组来确定数组中的单元格数,并且每个单元格的大小为int?

没有理由数组的类型必须与用于指定大小的变量的类型相同.因此,请使用long long指定大小的变量,然后int使用数组的类型.

int * p;
long long i;    
i=[size]; //This is calculated somewhere else.
p= new (nothrow) int [i];
Run Code Online (Sandbox Code Playgroud)

但是,当你说你需要创建一个"大到~7.13e + 17"的数组时,我很担心.我不知道你的意思是字节或元素,但对于直接数组而言,这两种方式都是非常巨大的.这已经进入了数PB的数据领域.

在32位程序中,这根本不可能.从理论上讲,你可以拥有一个高达几千兆字节的阵列(尽管实际上大多数情况下都是这样).

据我所知,在64位程序中,理论上你可以分配一个大的数组.但是,我怀疑大多数机器实际上可以处理它.由于此数据量将远远超过计算机中的RAM,因此操作系统将被迫将此阵列的大部分数据推送到页面文件中.但是,目前大多数典型计算机上的PB级页面文件远远超过了硬盘空间.

无论哪种方式,您可能需要认真考虑一种不同的方案,而不仅仅是一次分配整个大型数组.