堆与栈
关于堆和栈的问题,对于熟悉C++的同学来说可能理解的比较清楚,但是由于Java的一切对象都是在堆上,因此有时候可能反而会比较迷惑,比如:
为什么要分堆和栈?
堆和栈的区别是什么?
为什么堆是线程共享的而栈不是?
很多懂一点Java的人甚至是懂一点编程的人都知道内存一般分为堆和栈,栈由系统进行关系,而堆由程序员自己管理,...balabala,基本任何一本语言基础书都会提到这些特点,但是你有想过为什么吗?
为什么要分堆和栈
之所以要区分堆和栈,是由于程序需要两种不同特性的内存形似而确定的。在C++中,新建一个对象有两种方式,静态分配和动态分配,
静态分配
一般来说,静态分配用于初始化已知对象大小的时候,比如int a[10];
如果我们能够确定这个数组是10个,我们可以使用这种方式。这种方式所需要的内存在编译期间即可确定,因此操作系统便可以预先确定所指定大小内存给变量,并且可以在变量生命周期结束后自动释放。
动态分配
然而在某些场景下,可能需要根据某些情况来申请内存,比如int* a =new int[count];
而变量count
可能就来自于某个配置文件或者用户手动输入的值。这个时候操作系统就无法