美文网首页
C++中数组的最大长度

C++中数组的最大长度

作者: 退休码农飞伯德 | 来源:发表于2019-10-29 10:01 被阅读0次
世界第一高楼

最近写程序的时候,突然想到了这个问题:在C++中数组的长度有限制吗?我觉得肯定是有的,但限制是多少呢?经过了好长时间,我才勉强总结了一个答案。

宏观上的限制因素

  • 首先,如果要确定一个数组的最大长度,我们需要知道它的数据类型,因此,数组的数据类型是其中一个限制因素。因为不同数据类型的元素大小不同。很显然(我们假设int为4字节,char为1字节),数据类型为char的数组的最大长度是类型为int的数组的4倍。

  • 另外,我们不难想到,大小(size)的数据类型,也就是数组下标的数据类型,其实也是一个限制因素。在C/C++中,数组下标的类型是std::size_t,因此数组的大小首先不能超过size_t所能表示的大小。这个数据类型是在库文件stdio.h中通过typedef声明的,对于32位程序它被定义为unsighed int,对于64位程序定义为unsigned long。前者能表示的最大大小为232-1,后者为264-1。

  • 然后,我又想到了物理内存的大小。这一点不用细说,因为程序运行时一旦超过物理内存的大小,这个程序就会立刻崩溃。

微观上的限制因素

上面几点都是比较笼统的限制,我们换一个高大上的表达——宏观上的限制因素。下面,我们介绍几个微观上的限制因素

  • 大家应该都知道,数组的分配方式大概有两种方式:静态分配动态分配。再具体点儿的话,根据数组声明的位置,我们可以将数组分为局部数组全局数组。这样讨论的话,就复杂了,我们暂时可以将数组分为四类(只是笔者本人这样划分,不知道官方是否有这样的分类):静态分配的局部数组、动态分配的局部数组、静态分配的全局数组、动态分配的全局数组。

    • 第一种数组分配时,使用的是栈上的空间,因此静态分配得到的局部数组的大小受限于栈的大小。具体来说是数组所在函数栈帧的大小,当然栈帧的大小肯定不能超过栈的大小。如果你对编译器的使用比较熟悉或者你阅读过编译器文档的话,你应该知道如何调整栈帧的大小限制。在WINDOWS下,栈的大小是2M(也有的说是1M,总之是一个编译时就确定的常数),如果申请的空间超过栈的剩余空间时,将会提示溢出。
    • 对于第二种数组和第四种数组,我觉得应该划分为一类。本质上它们都是在堆上分配空间,因此它们的大小受限于堆的大小。堆是不连续的内存区域,堆的大小受限于计算机系统中有效的虚拟内存,因此堆的大小一般都比较大。
    • 至于第三种数组,我们知道它是在静态存储区分配内存空间,因此大小自然受限于静态存储区的大小,也叫做BSS(Block Started by Symbol),在汇编语言中,我么也称之为数据段。目前我还不太清楚静态存储区的大小限制,我在我的电脑(Core i3-3110M, 内存8GB)上做过实验发现我所能分配的最大大小大约为剩余内存的1/2。网上有这样说的:“你的常量有多大就多大”,但是还有待考证。

Note:关于栈帧的概念可以参考《深入理解计算机系统》这本书,或者其他关于计算机体系结构的资料。

注:本文迁移自我的csdn博客,具体地址为:https://blog.csdn.net/github_30605157/article/details/57084216

参考资料

相关文章

  • C++中数组的最大长度

    最近写程序的时候,突然想到了这个问题:在C++中数组的长度有限制吗?我觉得肯定是有的,但限制是多少呢?经过了好长时...

  • Go语言slice和数组的区别

    Go语言中数组是具有固定长度的相同数据类型元素的序列。而slice的长度可变。个人理解,类似C++中数组和vect...

  • 长度为0的数组

    数组的长度在编译时就确定了。长度为0的数组在标准C和C++中是不允许的,编译时会产生错误。但在GNU C中,这种用...

  • 36个常用js代码片段

    数组 Array 数组去重 查找数组最大 查找数组最小 返回已 size 为长度的数组分割的原数组 检查数组中某元...

  • C++学习之 char 数组定义

    C++ 中定义char 数组char ca1[] = "name";此时没有指定数组长度,则实际ca1的内存占用为...

  • C++数组长度可以为变量吗?

    关于C++数组提出几点问题: 预备 先看下这两段代码 变量作为数组的长度可行吗? 输出: 访问超过长度的数组下标的...

  • C++数组长度可以是变量吗

    关于C++数组提出几点问题: 预备 先看下这两段代码 变量作为数组的长度可行吗? 输出: 访问超过长度的数组下标的...

  • c++零碎问题记录

    2020年3月6日,正式开始学习C++。记录leetcode上遇到东西; 1.C++使用变量作为数组长度 数组长度...

  • C# 连续数字最大连续个数

    需求 [ 1, 2, 3, 4 .... n ] 连续数字中,没有断连的最大长度 获取数组中 1 连续出现的最大次...

  • Javascript学习笔记——7.4 数组长度

    每个数组都有一个length属性,即数组长度.数组长度不是元素的个数 非稀疏数组的length是元素的个数,比最大...

网友评论

      本文标题:C++中数组的最大长度

      本文链接:https://www.haomeiwen.com/subject/szrwvctx.html