内存布局图
各个字段的介绍
代码段(.text)
存放着机器码和只读数据,程序执行的指令都是从这里获取。这个段的内存一般被标记为只读,任何对该区域的写操作,都会导致段错误。
数据段
.data
存放着已经初始化的静态变量或全局变量。
.bss
存放着未初始化的静态变量或全局变量。
堆
堆用来存储运行时分配的变量。堆的大小不固定,其分配由new、malloc等实时内存分配函数实现。当进程调用malloc等函数时,新分配的内存被动态添加到堆上,当使用free等函数释放内存时,被释放的内存从堆中剔除。
栈
栈是用来存储函数调用时的临时信息的结构,如函数返回地址、函数参数、函数局部变量等。在程序运行时,由编译器在需要时分配,在不需要时自动清除。
堆栈区别
分配和管理方式不同
- 堆是动态分配的,其空间的分配和释放都由程序员控制。
- 栈由编译器自动管理。栈有两种分配方式:静态分配和动态分配。
产生碎片不同
- 对堆来说,频繁的new/delete或者malloc/free势必会造成内存空间的不连续,造成大量的碎片,使程序效率降低。
- 对栈而言,则不存在碎片问题,因为栈是先进后出的队列,永远不可能有一个内存块从栈中间弹出。
生长方向不同
- 堆是向着内存地址增加的方向增长的,从内存的低地址向高地址方向增长。
- 栈的生长方向与之相反,是向着内存地址减小的方向增长,由内存的高地址向低地址方向增长。
注意:由于栈的大小一般是可以确定的,所以栈可以从高地址向低地址增长。