程序的内存布局

程序源代码被编译后主要分为两种段:程序指令程序数据

  • 程序指令:代码段属于程序指令
  • 程序数据:包括数据段.data.bss

程序在内存空间上的布局如下图:




  1. 代码段(.text):这里存放的是CPU要执行的程序指令,代码是可共享的,相同的代码在内存中只有一份拷贝,同时这个段是只读的,防止程序误修改指令。
  2. 初始化数据段(.data):这里存放是程序中已初始化的全局变量和局部静态变量。代码段和初始化数据段都位于程序的可执行文件中,内核在调用exec函数启动该程序时,从源程序文件中读入。
  3. 未初始化数据段(.bss)[Block Started by Symbol 的缩写]存放未初始化的全局变量和局部静态变量。该段中的数据为内核启动该程序前,默认值都为 0 或 null,只是为全局变量和局部静态变量预留位置而已,它并没有内容,在文件中也不占据空间。但是在程序运行的时候,它们确定是要占用内存空间的。
  4. 堆(Heap):堆中存放的是 new 的对象,由程序员进行申请和释放
  5. 栈(stack):函数中的形参,局部变量以及在函数调用过程中产生的临时变量都保存在该段中,其由程序自动进行申请和释放,无需程序员干预。

将程序指令和程序数据分开的优势:

  1. 权限控制:程序被加载后指令和数据分别被映射到不同的虚拟存储区域,其中指令是只读的,数据是可读可写。这样可以避免误操作导致指令被篡改。
  2. 提高缓存命中率:指令和数据的分开存储有利于提高程序的局部性,这样可以分别针对频繁使用的数据和指令进行缓存,进而提高缓存的命中率,来提供程序的执行速度。
  3. 节约内存空间:当系统运行多个该程序的副本时,它的指令是一样的,所以内存中只需要保存一份该指令即可,从而大量的节省了内存空间,如在动态链接库中,会极大的节省内存空间。
posted @ 2023-07-07 11:47  Jeffxue  阅读(59)  评论(0编辑  收藏  举报