栈(stack)和堆(heap)
栈区(stack

  • 编译器自动分配(人为可以指定起始地址和大小,栈空间连续)释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。
  • 例如:arm在切换用户身份时,为每种身份指定的区域就属于stack;
  • 从高地址向低地址分配;

堆区(heap)

  • 程序员分配(空间不连续,可通过链表形式获取)释放, 若程序员不释放,程序结束时可能由OS回收。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。
  • 例如: malloc()分配的都是heap;
  • 从低地址向高地址分配;

堆和栈的区别可以用如下的比喻来看出:

  1. 使用栈就象我们去饭馆里吃饭,只管点菜(发出申请)、付钱、和吃(使用),吃饱了就走,不必理会切菜、洗菜等准备工作和洗碗、刷锅等扫尾工作,他的好处是快捷,但是自由度小。
  2. 使用堆就象是自己动手做喜欢吃的菜肴,比较麻烦,但是比较符合自己的口味,而且自由度大。

文献:
1、http://baike.so.com/doc/4915223-5133919.html
2、深入理解C#的装箱和拆箱 http://www.cnblogs.com/yukaizhao/archive/2011/10/18/csharp_box_unbox_1.html