1)栈区:由编译器自动分配和释放
一般存放函数的参数值、局部变量的值等
2)堆区:由程序员分配及释放。若程序员不释放,程序结束后可能由OS回收
3)寄存器区:用来保存栈顶指针和指令指针
4)全局区(静态区):全局变量和静态变量是存储在一起的。初始化的和未初始化的是分开的。
程序结束后由系统释放
5)文字常量区:程序结束后由系统释放
存放常量字符串
6)程序代码区:存放函数体的二进制代码
我知道在JAVA里也有堆和栈的区分,但在写代码时并不考虑他们之间的区别,因此很多人不是非常清楚。
1.JAVA堆栈和C++堆栈管理原理不同。本身双方的堆栈管理者就不同。C++自己并不管理堆栈,直接使用OS提供的接口来管理。JAVA的堆栈由JVM管理,JVM为了实现垃圾回收机制,以及解决堆效率等问题,在堆管理方面做了一些改进。在JAVA内存管理有简单的说明,这里不做深入。
2.JAVA堆栈与C++堆栈的实现效果类似。栈是程序运行时空间,由栈帧组成,由栈顶指针控制,分配和释放内存的效率高,但使用不灵活。堆用于动态地管理程序中的对象,使用灵活,但效率相对栈来说低一些。
3.JAVA堆栈与C++堆栈的使用方式不同。JAVA仅使用栈做程序运行以及简单类型的存放,所有的对象都放在堆中的管理。C++的堆和栈都可以用于存放对象,以哪种方式管理对象取决于开发人员的代码。(重要)
定义变量和数组时,Java默认初始化,C++不初始化;
在类中,方法中定义变量、动态数组时,Java默认初始化,C++不初始化
Java中有垃圾回收机制,C++没有。
Java中有垃圾回收机制,Java中new对象后不用管,不用考虑释放;虚拟机会自动去回收内存;C++中new了对象或分配内存后一定要记得释放,不然就会内存泄漏;要使C++创建对象自行释放,要自己实现一套引用计数的机制。