程序在内存中的布局

内存布局图

image

各个字段的介绍

代码段(.text)

存放着机器码和只读数据,程序执行的指令都是从这里获取。这个段的内存一般被标记为只读,任何对该区域的写操作,都会导致段错误。

数据段

.data

存放着已经初始化的静态变量或全局变量。

.bss

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

堆用来存储运行时分配的变量。堆的大小不固定,其分配由new、malloc等实时内存分配函数实现。当进程调用malloc等函数时,新分配的内存被动态添加到堆上,当使用free等函数释放内存时,被释放的内存从堆中剔除。

栈是用来存储函数调用时的临时信息的结构,如函数返回地址、函数参数、函数局部变量等。在程序运行时,由编译器在需要时分配,在不需要时自动清除。

堆栈区别

分配和管理方式不同

  • 堆是动态分配的,其空间的分配和释放都由程序员控制。
  • 栈由编译器自动管理。栈有两种分配方式:静态分配和动态分配。

产生碎片不同

  • 对堆来说,频繁的new/delete或者malloc/free势必会造成内存空间的不连续,造成大量的碎片,使程序效率降低。
  • 对栈而言,则不存在碎片问题,因为栈是先进后出的队列,永远不可能有一个内存块从栈中间弹出。

生长方向不同

  • 堆是向着内存地址增加的方向增长的,从内存的低地址向高地址方向增长。
  • 栈的生长方向与之相反,是向着内存地址减小的方向增长,由内存的高地址向低地址方向增长。

注意:由于栈的大小一般是可以确定的,所以栈可以从高地址向低地址增长。