在C++中,内存分成5个区,他们分别是堆、栈、自由存储区、全局/静态存储区和常量存储区。
- 栈: 存放函数的参数值,局部变量,函数执行结束时会被自动释放。栈内存分配运算内置于处理器的指令集中,效率高,但是容量有限。
- 堆: 是操作系统所维护的一块特殊内存,用于程序的内存动态分配,C语言使用malloc从堆上分配内存,使用free释放已分配的对应内存。。
- 自由存储区: 是C++基于new操作符的一个抽象概念,凡是通过new操作符进行内存申请,该内存即为自由存储区。
- 全局/静态存储区: 全局变量和静态变量被分配到同一块内存中,在C语言中,全局变量又分为初始化的和未初始化的,在C++里面没有这个区分了,他们共同占用同一块内存区。(data段:初始化的段;bss段:未初始化的段)
- 字符常量存储区: 常量字符串存于此,程序结束时由系统释放;
实例代码
1 |
|
static无论是全局变量还是局部变量都存储在全局/静态区域,在编译期就为其分配内存,在程序结束时释放,例如:a、b、f、g。
const全局变量存储在只读数据段,编译期最初将其保存在符号表中,第一次使用时为其分配内存,在程序结束时释放,例如:e;const局部变量存储在栈中,代码块结束时释放,例如:j。
全局变量存储在全局/静态区域,在编译期为其分配内存,在程序结束时释放,例如:c、d。
局部变量存储在栈中,代码块结束时释放,例如:h、i、j。
内存分区示意图:
我们说的data(初始化的段) bbs段(未初始化的段) 都是针对全局变量和静态变量来说的.
data又分为读写数据段(rw data) 和 只读数据段(ro data)
bbs是未初始化的全局变量和静态变量和 初始化为0 的全局变量和静态变量.
我们在函数里面的定义的局部变量(除static xxx)都是在stack or heap里面.
bbs段不影响a.out的大小,bbs段的数据用占位符标示而已,不在a.out里面.运行才产生.
stack heap也都是在运行的时候产生.
参考:
- https://blog.csdn.net/lxw907304340/article/details/79982824
- https://www.cnblogs.com/jcsu/articles/1051579.html
- https://www.polarxiong.com/archives/C-C-%E4%B8%AD%E5%B7%B2%E5%88%9D%E5%A7%8B%E5%8C%96-%E6%9C%AA%E5%88%9D%E5%A7%8B%E5%8C%96%E5%85%A8%E5%B1%80-%E9%9D%99%E6%80%81-%E5%B1%80%E9%83%A8%E5%8F%98%E9%87%8F-%E5%B8%B8%E9%87%8F%E5%9C%A8%E5%86%85%E5%AD%98%E4%B8%AD%E7%9A%84%E4%BD%8D%E7%BD%AE.html