C++五种内存分区
- 堆:使用
new
函数分配的内存块,使用应用程序控制,而不是编译器。每一个new
对应一个delete
。如果程序未回收变量,将会有操作系统自动回收。 - 栈(堆栈):使用编译器分配,并且自动清除。例如局部变量、函数参数。
- 自由储存区:使用
malloc
分配内存,使用free
释放内存。和堆相似。 - 静态(全局):存放全局变量和静态变量
- 常量:存放常量
堆 栈区别
- 举例
int* p=new int[5];
指针p保存在栈区,数组由new
函数申请,而保存在堆区,指针p指向这一段内存。 - 管理方式不同,栈由编译器自动管理,堆由程序中
new
和delete
函数管理,容易内存泄漏。 - 空间大小不同,堆所占内存较大
- 产生碎片,栈的数据结构紧密,一般不会产生碎片,堆会产生碎片。
- 空间大小:堆的内存较大。
- 生长方向不同:对于堆来讲,生长方向是向上的,也就是向着内存地址增加的方向。对于栈来讲,它的生长方向是向下的,是向着内存地址减小的方向增长。
- 分配效率:栈是机器系统提供的数据结构,计算机会在底层对栈提供支持:分配专门的寄存器存放栈的地址,压栈出栈都有专门的指令执行,这就决定了栈的 效率比较高。堆则是C/C++函数库提供的,它的机制是很复杂的,例如为了分配一块内存,库函数会按照一定的算法(具体的算法可以参考数据结构/操作系 统)在堆内存中搜索可用的足够大小的空间,如果没有足够大小的空间(可能是由于内存碎片太多),就有可能调用系统功能去增加程序数据段的内存空间,这样就 有机会分到足够大小的内存,然后进行返回。显然,堆的效率比栈要低得多。
static
关键字控制变量储存方式
-
static
关键字意义,使类中的一个变量为所有的类服务,而不是某一个对象。不破坏类的封装性,并且隐藏在类内部。 - 优势:节省内存,同类共享。
- 类的静态成员函数是属于整个类而非类的对象,所以它没有this指针,这就导致了它仅能访问类的静态数据和静态成员函数。
- 不能将静态成员函数定义为虚函数。
- 初始化只执行一次。