关于堆和栈

语言和语言实现是两回事. 不同的语言,语法和运行方式是不同的, 但是用来实现的功能其实都是差不多, 比如条件判断,文件读写等等,这些都是编程语言需要实现的, 只是高级点的语言,从编程思想上更加契合人类的思维,比如面向对象, 但同时带来的可能就是效率问题, 另一个极端就是汇编语言, 从人类的角度很难理解, 它更适合计算机理解, 虽然计算机理解的只是0和1,

所以编程初学者动不动总会说什么功能这个语言能实现, 用那个语言实现不了, 终究只是见识问题. 当然有可能也是因为见识问题, 才能得出这样的结论.

自勉.

靠近编程的实质才是王道.以下是从网上搜到的关于堆栈的理解.

堆(heap)和栈(stack)都是一种数据项按序排列的数据结构, 但两个是完全不同的概念, 堆栈只是一种模糊的说法, 但有时候"堆栈”表示的是栈,而不是堆.

stack

  1. 数据结构: 它是具有一种后进先出的数据结构.
  2. 分配方式: stack 有两种分配方式.静态分配和动态分配。静态分配是编译器完成的,比如局部变量的分配。动态分配由alloca函数进行分配. 但两种分配方式都是由系统自动回收的
  3. 分配效率: 速度很快. 程序员只要定义变量,就完成了栈内存的分配,不需要为释放写代码。这种对象(变量),是有名对象(变量), statck 中的数据生命周期十分有限, 只存在于函数的运行过程中, 运行后就会释放掉,不可以再访问.
  4. 大小限制: windows 下, stack是向低地址扩展的的数据结构, 是一块连续的内存区域, 也就是说栈顶地址和栈最大容量是预先被设定好的, 大小为2M, 如果申请时超过了, 会提示 overflow
  5. 存放内容: 在函数调用时,第一个进栈的是主函数中函数调用后的下一条指令(函数调用语句的下一条可执行语句)的地址,然后是函数的各个参数,在大多数的C编译器中,参数是由右往左入栈的,然后是函数中的局部变量。注意静态变量是不入栈的。 当本次函数调用结束后,局部变量先出栈,然后是参数,最后栈顶指针指向最开始存的地址,也就是主函数中的下一条指令,程序由该点继续运行

heap

  1. 数据结构: 它是一种经过排序的树形数据结构. 便于随机存取
  2. 分配方式: 堆都是动态分配的,没有静态分配的堆。释放需要手动释放
  3. 分配效率: 它是程序猿根据需要自己申请的空间, 比如 new 操作, 一般速度较慢,而且容易产生碎片, 但用起来比较方便. 比如 C语言要调用库函数中的 malloc(10),即开辟十个字节的空间. C++ 除了C的方式,增加了new ,delete ,new[],delete[] 运算符用于分配堆区内存。堆内存,对于C,C++是无名内存区域,所以必须通过有名的指针,或者有名的指针相关的其他指针,间接使用.也就是说高级编程语言,透过名字来操作内存(数据),而不是直接使用,内存位置(地址).heap 上得数据只要程序猿不释放空间, 就可以一直访问, 但一旦忘记了释放空间就会导致内存泄露
  4. 大小限制: heap 是向高地址扩展的数据结构, 是不连续的内存区域. heap 的大小受限于系统的虚拟内存.
  5. 存放内容: 一般是在堆的头部用一个字节存放堆的大小。堆中的具体内容有程序员安排。

专门讲内存分区的视频:
2.21.C语言内存分区栈区 http://www.tudou.com/listplay/z5u9lwXuPKU/xduZ8JPrbl8.html
2.22.C语言内存分区堆区 http://www.tudou.com/listplay/z5u9lwXuPKU/ArQuU8Alh5s.html
2.23.C语言内存分区全局静态区 http://www.tudou.com/listplay/z5u9lwXuPKU/5xrTN2m4yqc.html
2.24.C语言内存分区文字常量区_代码区 http://www.tudou.com/listplay/z5u9lwXuPKU/etv4mUFAzns.html

stack 和 heap 都是动态存储区, 而不是静态的. 所谓静态的, 就是会一直存在的不会消失的. 静态变量就是放在静态存储区的.

2015-07-15 11:001