一、内存分配方式:,
1、 全局/静态/常量存储区,是在程序编译时就已经分配好的,在整个运行期间都存在,如全局变量、静态局部变量、静态全局变量、常量。
2、 栈上分配,由编译器在需要的时候分配,在不需要的时候自动清除,局部变量、函数参数就是从这分配的,但分配的内存容易有限。对于栈来讲,它的生长方式是向下的,是向着内存地址减小的方向增长。在vc编译器中,默认的栈大小是1M,可自己修改。
3、 堆上分配,也称动态分配,由new,malloc分配内存,他们的释放编译器不管,用delete,free来释放的内存。如果没有释放掉,程序结束后,操作系统会自动回收。对于堆来讲,生长方向是向上的,也就是向着内存地址增加的方向;一般来讲,在32为系统下面,堆内存可达到4G的空间。(注:堆是操作系统维护的一块内存,它提供了动态分配的功能,而自由存储是C++中通过new与delete动态分配和释放对象的抽象概念。基本上,所有的C++编译器默认使用堆来实现自由存储,但也可以不用堆实现。)
二、内存空间划分:
1 栈区:栈中保存基本数据类型的变量和自定义对象的引用(不是对象,对象本身放堆区),被执行的方法的也是pull到栈中,当方法执行完后再push出栈。比如局部变量
2 堆区:Test t = new Test(); 对象的引用t存在栈中,new Test()对象在堆中。堆中存储的都是对象,每个对象包含一个与之对应的class信息。
3 代码区:函数、类中的方法,存在代码区。
4 全局数据区:静态变量、全局变量、常量。类的static变量是全局的,是类的所有对象都能访问的,非static变量是私有的,是每个对象独有的特有的,并且只有非static方法才可以访问。
堆和栈的主要区别由以下几点:
1、管理方式不同;
2、空间大小不同;
3、能否产生碎片不同;
4、生长方向不同;
5、分配方式不同;
6、分配效率不同;