C++中的数组是否有最大长度?
它是C++限制还是取决于我的机器?它可以调整吗?它取决于数组的类型吗?
我可以以某种方式突破该限制,还是必须寻找更好的信息存储方式?什么应该是最简单的方法?
我要做的是在数组上存储long long int,我在Linux环境中工作.我的问题是:如果我需要存储N> 10位数的N长整数数组,我该怎么办?
我需要这个,因为我正在为学校编写一些加密算法(例如p-Pollard),然后点击这个整数墙和数组表示的长度.
有两个限制,既不是由C++强制执行,而是由硬件强制执行.
第一个限制(永远不应该达到)由用于描述数组中索引的大小类型的限制(及其大小)设置.它由系统std::size_t
可以采用的最大值给出.此数据类型应始终是系统的最大整数类型.
另一个限制是物理内存限制.数组中的对象越大,达到此限制的时间越早,因为内存已满.例如,vector
给定大小n的a通常占用类型数组的大约四倍的内存vector
(减去一个小的常数值).因此,a vector
可能包含比vector
内存已满之前更多的项目.对于本机C风格的数组int[]
和char[]
.
另外,这个上限可能受到allocator
用于构造它的类型的影响,vector
因为allocator
可以以任何方式自由地管理存储器.一个非常奇怪但仍然可以想象的分配器可以以一种对象的相同实例共享资源的方式来池化内存.这样,您可以将大量相同的对象插入到容器中,否则会耗尽所有可用内存.
除此之外,C++不强制执行任何限制.
没有人提到堆栈框架大小的限制.
有两个地方可以分配内存:
在堆上(动态分配的内存).
这里的大小限制为可用的硬件组合和OS的使用其他设备暂时存放未使用的数据(模拟空间能力,即移动页面到硬盘).
在堆栈上(本地声明的变量).
这里的大小限制是编译器定义的(具有可能的硬件限制).如果您阅读编译器文档,您通常可以调整此大小.
因此,如果您动态分配一个数组(限制很大,并由其他帖子详细描述.
int* a1 = new int[SIZE]; // SIZE limited only by OS/Hardware
或者,如果数组在堆栈上分配,那么您将受到堆栈帧大小的限制.NB向量和其他容器在堆栈中的存在很少,但通常大部分数据都在堆上.
int a2[SIZE]; // SIZE limited by COMPILER to the size of the stack frame
从实用而非理论的角度来看,在32位Windows系统上,单个进程可用的最大内存总量为2 GB.您可以通过使用具有更多物理内存的64位操作系统来突破限制,但是,是否执行此操作或查找替代方案在很大程度上取决于您的预期用户及其预算.您也可以使用PAE进行一些扩展.
数组的类型非常重要,因为许多编译器的默认结构对齐是8个字节,如果内存使用是一个问题,这是非常浪费的.如果您使用Visual C++来定位Windows,请查看#pragma pack指令作为克服此问题的方法.
另一件事是看内存压缩技术可能对你有什么帮助,例如稀疏矩阵,即时压缩等等......再次,这是高度依赖于应用程序的.如果您编辑帖子以提供有关阵列中实际内容的更多信息,您可能会获得更多有用的答案.
编辑:给出关于您的确切要求的更多信息,您的存储需求似乎在7.6 GB到76 GB之间未压缩,这需要相当昂贵的64位盒作为数组存储在C++的内存中.它提出了一个问题,为什么要将数据存储在内存中,其中假设访问速度,并允许随机访问.将此数据存储在数组之外的最佳方法几乎取决于您希望如何访问它.如果您需要随机访问数组成员,对于大多数应用程序,往往会有一些方法可以对可能同时访问的数据块进行分组.例如,在大型GIS和空间数据库中,数据通常按地理区域进行平铺.在C++编程术语中,您可以覆盖[]数组运算符,以根据需要从外部存储中获取部分数据.