首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在C++中是否有最大数组长度限制?

在C++中是否有最大数组长度限制?
EN

Stack Overflow用户
提问于 2008-10-19 10:39:11
回答 7查看 316.8K关注 0票数 198

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

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

我能以某种方式打破这个限制吗?或者我必须寻找一种更好的存储信息的方法?那么最简单的方法是什么呢?

我要做的是在数组中存储long long int,我是在Linux环境中工作的。我的问题是:如果我需要存储N个大于10位的N个长整型数组,我必须做什么?

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

EN

回答 7

Stack Overflow用户

发布于 2008-10-19 11:54:23

从实际而不是理论的角度来看,在32位Windows系统上,单个进程的最大可用内存总量是2 GB。您可以使用具有更多物理内存的64位操作系统来打破限制,但是是这样做还是寻找替代方案在很大程度上取决于您的目标用户和他们的预算。您还可以使用PAE对其进行一些扩展。

数组的类型非常重要,因为在许多编译器上,默认的结构对齐是8字节,如果内存使用是一个问题,这是非常浪费的。如果您使用Visual C++作为目标窗口,请查看#pragma pack指令作为克服此问题的一种方法。

另一件要做的事情是看看内存压缩技术可能会对你有什么帮助,比如稀疏矩阵,动态压缩等等。同样,这是高度依赖于应用程序的。如果你编辑你的帖子,给出更多关于数组中实际内容的信息,你可能会得到更多有用的答案。

编辑:给出更多关于您确切需求的信息,您的存储需求似乎在7.6 GB到76 GB之间,这将需要一个相当昂贵的64位框来存储为C++中的内存中的数组。它提出了一个问题,为什么要将数据存储在内存中,在内存中,人们假设访问速度,并允许随机访问。将此数据存储在数组外部的最佳方式很大程度上取决于您想要访问它的方式。如果您需要随机访问数组成员,那么对于大多数应用程序来说,往往有对同时访问的数据块进行分组的方法。例如,在大型GIS和空间数据库中,数据通常按地理区域平铺。在C++编程术语中,您可以覆盖[]数组运算符,以便根据需要从外部存储中获取部分数据。

票数 13
EN

Stack Overflow用户

发布于 2008-10-19 10:49:58

我同意上面的观点,如果你用初始化数组

代码语言:javascript
复制
 int myArray[SIZE] 

则大小受整数大小的限制。但是,只要malloc不返回NULL,你可以随时malloc一块内存,并有一个指向它的指针,只要你想要的大小。

票数 4
EN

Stack Overflow用户

发布于 2016-08-09 04:38:03

正如许多优秀的答案所指出的那样,有很多限制取决于您的C++编译器版本、操作系统和计算机特性。但是,我建议在Python上使用以下脚本检查机器上的限制。

它使用二进制搜索,并在每次迭代中通过创建尝试创建大小为中等大小的数组的代码来检查是否可能达到中等大小。脚本尝试编译它(对不起,这部分只在Linux上有效),并根据成功情况调整二进制搜索。看看这个:

代码语言:javascript
复制
import os

cpp_source = 'int a[{}]; int main() {{ return 0; }}'

def check_if_array_size_compiles(size):
        #  Write to file 1.cpp
        f = open(name='1.cpp', mode='w')
        f.write(cpp_source.format(m))
        f.close()
        #  Attempt to compile
        os.system('g++ 1.cpp 2> errors')
        #  Read the errors files
        errors = open('errors', 'r').read()
        #  Return if there is no errors
        return len(errors) == 0

#  Make a binary search. Try to create array with size m and
#  adjust the r and l border depending on wheather we succeeded
#  or not
l = 0
r = 10 ** 50
while r - l > 1:
        m = (r + l) // 2
        if check_if_array_size_compiles(m):
                l = m
        else:
                r = m

answer = l + check_if_array_size_compiles(r)
print '{} is the maximum avaliable length'.format(answer)

您可以将其保存到您的计算机并启动它,它将打印您所能创建的最大尺寸。对于我的机器,它是2305843009213693951。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/216259

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档