后台开发-核心技术与应用实践笔记(linux程序内存空间布局)

linux下C程序的内存五区:

代码段:存放程序执行代码的一块区域。

数据段:包括初始化数据段和未初始化数据段。初始化数据段用于存放已初始化的全局变量和已初始化的静态变量。未初始化数据段用于存放未初始化的全局变量和未初始化的静态变量。

字符串常量区:存放字符串常量

堆:存放程序运行过程中被动态分配的内存块。当调用malloc/new的时候,新分配的内存将被添加到堆上(堆扩张),调用free/delete的时候,要释放的内存将从堆移除(堆缩减)。

栈:存放局部变量

堆和栈的区别:

1,申请方式不同。

栈由系统自动自动分配。

堆需要程序员自己申请。

2,申请以后系统的响应不同

栈:只要栈的剩余空间小于申请的空间,系统九就提供内存,否则报错栈溢出

堆:操作系统有一个用于记录空闲内存地址的链表,当我们申请内存的时候,操作系统会遍历一次该链表,找到第一个大于申请空间的堆节点,然后将该节点从空闲链表中删除,将这个节点的空间分配给程序。另外,一般会在这个空间的首地址处存放内存的大小,以便之后正确delete。如果找到的节点的大小大于所申请的空间,则将多出来的部分重新插入到空闲链表中。

3,申请大小的限制不同

栈:从高地址到低地址扩张,且内存空间是连续的。栈大小有限,一般为10M左右。

堆:从低地址向高地址扩张,内存空间不连续。这是因为操作系统是用链表存储空闲空间的,因此不会连续,链表的遍历方向为从低到高。堆大小受限于虚拟内存的大小。堆空间比较灵活且大。

4,申请效率不同

栈由操作系统分配,速度较快

堆由程序员分配,速度较慢,且容易产生碎片,但使用很方便。

5,存储内容不同

栈:在函数调用时,第一个进栈的是主函数中后的下一条指令( 函数调用语句的下一条可执行语句)的地址,然后是函数的各个参数。在大多数的 C 编译器中,参数是由右往左入栈的,然后是函数中的局部变量。 注意静态变量是不人栈的 。 当本次函数调用结束后,局部变量先出钱,然后是参数,最后找顶指针指向最开始存的地址,也就是主函数中的下一条指令,程序由该点继续运行 。

堆:一般是在堆的头部用一个字节存放堆的大小 。

猜你喜欢

转载自blog.csdn.net/u012260341/article/details/79689991