为什么栈的数组长度必须是一个常量?而堆的数组长度可以是变量。为什么栈的大小有限制?

为什么栈的数组长度必须是一个常量?而堆的数组长度可以是变量

栈区数组长度使用变量会报错

其原因就在于栈是编译器管理的,在程序运行前就已经分配好了空间的大小。而使用变量,编译器无法知道该分配多大的内存空间,于是报错。但堆上的内存是动态创建的,是在程序运行的同时为为它申请内存。(堆里的动态数组,是程序运行过程中动态申请的,而栈不一样,申请的数组长度在编译时就要确定下来,所以必须是确定的数字)

也正因为栈是程序运行前就已经分配好了空间,直接编译为二进制可执行代码,运行时几乎不需要时间,所以栈的运行速度要比堆快。而动态创建是将分配过程从编译器搬到了运行的代码中,相当于将分配内存的耗时从编译阶段转嫁到了机器运行阶段。于是堆的申请耗时,不仅仅跟使用的内存算法有关,还跟运行代码的机器速度有关。

 

 

为什么栈的大小有限制?

编译器对栈区数组的长度有限制。

因为栈的地址空间必须连续,如果任其任意成长,会给内存管理带来困难。对于多线程程序来说,每个线程都必须分配一个栈,因此没办法让默认值太大。

 

相关链接

为什么栈的运行速度比堆快?:为什么栈的效率比堆高?

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值