C ++中有最大数组长度限制吗?


181

C ++中的数组有最大长度吗?

是C ++限制还是取决于我的机器?可以调整吗?它是否取决于数组的类型?

我可以以某种方式打破该限制吗?还是我必须寻找一种更好的信息存储方式?而最简单的方法应该是什么?

我要做的是将长整型存储在数组中,我正在Linux环境中工作。我的问题是:如果我需要存储N个大于10位的N个长整型数组,该怎么办?

我需要这样做是因为我正在为学校编写一些加密算法(例如p-Pollard),并碰到了整数和数组表示长度的墙。

Answers:


163

有两个限制,不是由C ++强制执行,而是由硬件强制执行。

通过用于描述数组中的索引的大小类型(及其大小)的限制来设置第一个限制(永远不要达到)。它由系统std::size_t可以采用的最大值给出。此数据类型足够大,可以包含任何对象的字节大小

另一个限制是物理内存限制。数组中的对象越大,因为内存已满,越早达到此限制。例如,vector<int>给定大小n的a通常占用的内存是类型数组的数倍vector<char>(减去较小的常数),因为int通常大于char。因此,a vector<char>可能比vector<int>内存已满之前包含的项目更多。对于原始C样式数组(例如int[]和),其计数也相同char[]

此外,此上限可能会受allocator用于构造的类型的影响,vector因为an allocator可以随意使用其想要的任何方式来管理内存。一个非常奇怪但仍然可以想到的分配器可以以相同对象实例共享资源的方式来缓冲内存。这样,您可以将很多相同的对象插入到容器中,否则将耗尽所有可用内存。

除此之外,C ++没有任何限制。


20
同样,您通常可以轻松达到堆栈大小限制,特别是如果使用的线程又是特定于实现的(但可以更改)。
Alaric

@Alaric:是的。我不想过于深入地研究系统细节,因为它们之间的差异很大,而且我也不是其中的专家。
康拉德·鲁道夫

@Konrad,关于分配器类型的有趣观点,并不是我所知道的。谢谢(你的)信息。
SmacL

11
std :: size_t通常是(总是?)指针的大小,而不是整数数学单位中具有本机硬件支持的最大整数的大小。在我使用的每个x86操作系统上,对于32位操作系统,size_t是32位,对于64位操作系统,size_t是64位。
福兹先生09年

2
我的理解是,数组的最大限制是处理器word的最大值。这是由于索引运算符。例如,一台机器的字长可以为16位,而寻址寄存器为32位。传递给new或的参数限制了一块内存的大小malloc。可以通过指针访问比数组大的内存块。
Thomas Matthews
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.