C++的内存空间--堆栈

前言——内存空间布局

C++内存空间布局图标对照。

C++的内存空间--堆栈

segment meaning

command-line arguments and

environment variables

命令行参数和环境变量
stack
heap
bss 未初始化数据段
data 初始化数据段
text

正文段

 

 

 

 

 

 

 

linux下32位内存空间分布图。

C++的内存空间--堆栈

1.命令行参数和环境变量

shell在执行程序的时候调用exec函数将命令行参数传递给要执行的程序。

使程序了解进程环境,在执行时分配空间。

2.bss段(Block Start by Symbol)

存放未初始化的全局变量或者静态变量。

3.data段

存放具有明确初始值的全局变量或者静态变量。

存在于程序镜像文件中,由 exec 函数从程序镜像文件中读入内存。

4.text段

CPU执行的机器指令。

 

堆栈简要概述

栈:系统自动开辟空间,自动分配自动回收,在作用域运行完成后(函数返回时)就会被回收。

堆:由程序员自己申请空间,释放空间,不释放会出现内存泄漏。

 

1.栈是连续的向下扩展的数据结构,总共只有1M或者2M的空间。空间不足就会异常提示栈溢出。

2.存储自动变量, 函数调用者信息, 包括函数参数(可变参数列表的压栈方向是从右向左), 函数内局部变量, 函数返回值, 函数调用时的返回地址。

 

1.堆是不连续的向上扩展的数据结构,大小受限于计算机系统虚拟内存的大小。

2.操作系统有一个记录空闲内存地址的链表,当系统收到程序的申请时,会遍历该链表,寻找第一个空间大于所申请空间的堆结点,然后将该结点从空闲结点链表中删除,并将该结点的空间分配给程序。

对于大多数系统,会在这块内存空间中的首地址处(一般为一个字节的大小)记录本次分配的大小,这样,代码中的 delete语句才能正确的释放本内存空间。

由于找到的堆结点的空间大小可能大于申请的大小,系统会自动的将多余的那部分(即内存碎片)重新放入空闲链表中。这就涉及到申请效率的问题