C++内存分配方式
栈
编译器在需要的时候分配,在不需要的时候自动清除的变量的存储区。包括局部变量、函数参数等。在一个进程中,位于用户虚拟地址空间顶部的是用户栈,来实现函数的调用。用户栈在程序执行期间可以动态地扩展和收缩。
堆
new分配的内存块,由delete释放或在程序结束后,操作系统自动回收,也可动态地扩展和收缩。
自由存储区
和堆类似 由malloc分配的内存块,通过free来释放
全局/静态存储区
在C++中全局变量和静态变量分配到同一块内存
常量存储区
里面存放的是常量
堆栈区别
例:
void f() { int *p = new int[5]; } //在栈内存存放了一个指向一块堆的指针p
- 管理方式不同;
- 空间大小不同
- 能否产生碎片不同
- 生长方向不同
- 分配方式不同
- 分配效率不同
管理方式
栈是由编译器自动管理,堆需要程序员手动释放。
空间大小
在32位系统下,堆达到4G,栈很小。
碎片问题
对于堆来讲,new/delete 会造成内存空间的不连续。而栈不会存在这些问题
生长方向
堆:向着内存地址增加的方向增长 栈:向着内存地址减小的方向增长
分配方式
堆:动态分配,不存在静态分配。 栈:静态分配和动态分配
分配效率
栈比堆效率高
static
可以在类中声明 : <类名>::<静态成员名>
- 类的静态成员函数不存在this指针,它仅能访问类的静态成员函数和静态数据
- 不能将静态成员函数定义为虚函数
- 静态成员声明于类中,操作于外,变量地址是指向其数据类型的指针,函数地址类型是一个”非成员函数指针“
- 静态成员函数等同于”非成员函数“
- static缩短了子类对父类静态成员的访问时间,节省了子类的内存空间
- 静态数据成员是静态存储的,得初始化
- 初始化在类外进行,不加static
格式:<数据类型><类名>::<静态数据成员名>=<值>
- 静态变量为父类子类共享
- 可在子类定义与基类相同的静态变量,直接覆盖。