C++内存
堆和栈的区别
- 空间分配方式不同
- 缓存方式不同
- 堆使用二级缓存,速度较慢
- 栈是一级缓存,调用完毕立即释放,速度块
- 数据结构不同
- 空间不同
C++内存管理
- C++内存管理分为5个区,堆,栈,自由存储区,静态存储区,常量存储区
- 栈:函数内局部变量创建在栈上,函数执行完内存被释放
- 堆:由
new
分配的内存块,一个new
对应一个delete
- 自由存储区:由
malloc
分配的内存块,和堆相似,不同的是由free
结束
- 静态存储区:全局变量和静态变量被分配到同一块内存中
- 常量存储区:存放的是常量
程序的组成,各部分的作用
- 组成:(地址从地到高)代码段,数据段,BSS段,堆,共享区,栈
- 代码段:存放程序执行代码的一块内存区域,只读
- 数据段:存放已初始化的全局变量和静态变量
- BSS段:存放未初始化的全局变量和静态变量
- 堆:动态申请内存,堆从低地址向高地址增长
- 栈:存放局部变量,函数参数值,从高地址向低地址增长
- 共享区:位于堆栈之间
内存泄漏
- 概念:申请一块内存后没有释放
- 检测方法
- 使用内存分配函数后记住释放内存
- 使用智能指针
- 采用链表方法管理已分配的内存,使用完毕后查改链表
- 采用工具插件
内存对齐
- 内存对齐应用于三种数据类型:
struct
,class
,union
- 什么是内存对齐?
- 结构体是一种复合的数据结构,在结构体中,编译器为结构体的每个成员按其自然边界分配空间,第一个成员的地址和结构体的地址相同,为了使CPU对变量进行快速访问,需要对变量的起始地址进行对齐操作,例如4字节的int类型的起始地址应该在4字节的边界上,即起始地址能被4整除
- 为什么要内存对齐?
- 提高CPU访问数据的效率,例如不对齐的情况下,起始位置为
Ox000000002
访问int
变量需要访问两次内存,第一次取Ox00000002-Ox00000003
,第二次取Ox00000004-Ox00000004
,组合之后才能得到整形数据
回到页面顶部