堆栈

1

  • 数据结构中有堆栈的概念。栈表示后进先出的线性结构;堆表示有序的树。

    btw,the blog in this link is marvalous!白话经典算法|秒杀多线程面试系列|Windows C编程|C++ STL

  • 内存管理中也有堆栈的概念。栈是系统分配的内存,堆是程序员可以操作的内存。

2

  • 一般情况下程序存放在Rom或Flash中,运行时需要拷到内存中执行,内存会分别存储不同的信息
  • 内存中的栈区处于相对较高的地址以地址的增长方向为上的话,栈地址是向下增长的。
  • 栈中分配局部变量空间
  • 堆区是向上增长的用于分配程序员申请的内存空间。
  • 另外还有静态区是分配静态变量,全局变量空间的;
  • 只读区是分配常量和程序代码空间的。
  • 操作系统有一个记录空闲内存地址的链表,当系统收到程序的申请时,会遍历该链表,寻找第一个空间大于所申请空间的堆。
  • 由系统自动分配,速度较快。但程序员是无法控制的。

3

  • 栈是向低地址扩展的数据结构,简单来说就是大小限制了。windows下大约是1-2M。
  • 堆是向高地址扩展的数据结构,是不连续的内存区域。链表的遍历方向是由低地址向高地址。堆的大小受限于计算机系统中有效的虚拟内存。
  • 一级缓存?二级缓存?
  • 堆栈的操作相关的两个寄存器是EBP寄存器和ESP寄存器的,本文中,你只需要把EBP和ESP理解成2个指针就可以了。
  • ESP指向栈顶,执行push|pop操作。
  • EBP指向中间,函数的参数地址比EBP的值高,而函数的局部变量地址比EBP的值低,因此参数或局部变量总是通过EBP加减一定的偏移地址来访问的。

    堆栈中的数据

  • 函数的参数
  • 函数的局部变量
  • 寄存器的值(用以恢复寄存器)
  • 函数的返回地址以及用于结构化异常处理的数据(当函数中有try…catch语句时才有,本文不讨论)。
  • 这些数据是按照一定的顺序组织在一起的,我们称之为一个堆栈帧(Stack Frame)。一个堆栈帧对应一次函数的调用。在函数开始时,对应的堆栈帧已经完整地建立了(所有的局部变量在函数帧建立时就已经分配好空间了,而不是随着函数的执行而不断创建和销毁的);在函数退出时,整个函数帧将被销毁。

待参考博客·内存管理!

  • 讲堆栈而不讲内存管理,有什么意义。
  • http://www.cnblogs.com/Binhua-Liu/archive/2010/06/22/1762873.html
  • http://www.cnblogs.com/Binhua-Liu/archive/2010/08/24/1803095.html
  • http://m.ctocio.com.cn/security/485/7723985_m.shtml

你可能感兴趣的:(堆栈)