操作系统中程序的内存结构总结

  • Post author:
  • Post category:其他

程序的内存结构

图是引用其他博客的
一个程序本质上都是由BSS段、数据段、代码段三个组成的。可以看到一个可执行程序在存储(没有调入内存)时分为代码段、数据区和未初始化数据区三部分。

BSS段

(未初始化数据段)通常用来存放程序中未初始化的全局变量和静态变量的一块内存区域。BSS段属于静态分配,程序结束后静态变量资源由系统自动释放。

数据段

存放程序中已初始化的全局变量的一块内存区域。数据段也属于静态内存分配。

代码段

存放程序执行代码的一块内存区域。这部分区域的大小在程序运行前就已经确定,并且内存区域属于只读。在代码段中,也有可能包含一些只读的常数变量。

栈区

由编译器自动释放,存放函数的参数值、局部变量等。每当一个函数被调用时,该函数的返回类型和一些调用的信息被存放到栈中。然后这个被调用的函数再为他的自动变量和临时变量在栈上分配空间。每调用一个函数一个新的栈就会被使用。栈区是从高地址位向低地址位增长的,是一块连续的内存区域,最大容量是由系统预先定义好的,申请的栈空间超过这个界限时会提示溢出,用户能从栈中获取的空间较小。

堆区

用于动态分配内存,位于BSS和栈中间的地址区域。由程序员申请分配和释放。堆是从低地址位向高地址位增长,采用链式存储结构。频繁的申请释放内存造成内存空间的不连续,产生碎片。当申请堆空间时库函数(malloc,对应释放是free)是按照一定的算法搜索可用的足够大的空间。new(对应释放是delete)是关键字,会调用对象的构造和析构函数。因此堆的效率比栈要低的多。


版权声明:本文为weixin_42168958原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。