什么是堆、栈? fr net

什么是堆、栈?

(2009-08-01 21:48:31)
标签:

it

分类:编程学习

程序需要的内存空间分为 heap(堆) 和 stack(栈);

heap 是自由存储区, stack 是自动存储区;

使用 heap 需要手动申请、手动释放, stack 是自动申请、自动释放;

使用 heap 时, 如果只申请不释放, 就会发生"内存泄露";

不需要申请和释放空间的元素, 譬如变量、结构(record)等, 是存与 stack(栈);

反之如需要 Create 和 Free 的对象、需要 GetMem 和 FreeMem 的指针等, 则是存于heap(堆);

stack 比 heap 快一点点.

栈之所以快就是因为它是物理连续的、所有操作都是指针跳转、传统数组就是因为这一点所以是最快的.

 

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

  使用栈就象我们去饭馆里吃饭,只管点菜(发出申请)、付钱、和吃(使用),吃饱了就走,不必理会切菜、洗菜等准备工作和洗碗、刷锅等扫尾工作,他的好处是快捷,但是自由度小。

  使用堆就象是自己动手做喜欢吃的菜肴,比较麻烦,但是比较符合自己的口味,而且自由度大。

 

堆栈是一种存储部件,即数据的写入跟读出不需要提供地址,而是根据写入的顺序决定读出的顺序

 

  这是一个前辈写的,非常详细

  //main.cpp

  int a = 0; 全局初始化区

  char *p1; 全局未初始化区

  main()

  {

  int b; 栈

  char s[] = "abc"; 栈

  char *p2; 栈

  char *p3 = "123456"; 123456\0在常量区,p3在栈上。

  static int c =0; 全局(静态)初始化区

  p1 = (char *)malloc(10);

  p2 = (char *)malloc(20);

  }

  分配得来得10和20字节的区域就在堆区。

  strcpy(p1, "123456");123456\0放在常量区,编译器可能会将它与p3所指向的"123456"优化成一个地方。

          (1)Registers(寄存器):在CPU内部,是最快的存储场所,但程序员无法直接控制。          (2)Stack(栈):位于一般的RAM(随机访问内存),速度仅次于Registers。存放基本类型的数据和对象的reference,但对象本身不存放在stack中,而是存放在Heap中。          (3)Heap(堆):也位于RAM,存放用new产生的数据。他比stack好在编译器不需要知道实际在heap中存储数据的大小,也不知道这个空间需要分配多长时间,弹性好,但分配空间的速度比Stack慢很多。           (4)Static  storage(静态存储空间):位于RAM,存放在对象中用static定义的静态成员,它是“程序执行期间”一直存在的数据,Java对象本身是不会被分配在这里的。           (5)Constant  storage(常量存储空间):存放常量。           (6)NON-RAM存储空间:硬盘等永久存储空间,实现对象的持久化存储。

相关文章
相关标签/搜索