黑马程序员-堆与栈

来源:互联网 发布:越狱铃声软件 编辑:程序博客网 时间:2024/06/07 00:02

------- android培训java培训、期待与您交流! ----------

堆栈在语言开发中,很重要,但我对其一直不是非常理解,于是,仔细百度了一下,现将总结与感想记下,以备自己闲时再翻看一番。

首先,堆是堆,栈是栈,堆栈不是堆与栈,是运行时的栈。

1,堆:堆是存储在硬盘上的,栈:栈存放在内存上。

因为每次读取数据,栈里的数据是直接从内存读的,而堆里的数据,需要从硬盘读取到内存,所以,堆的速度不及栈的快。

​2,堆的空间大,栈的小。

从一方面讲,堆是存在硬盘上,栈是在内存上,自然是堆的空间大,栈的空间小。从另一层名讲,堆是向高地址扩展,而栈是向低地址扩展(windows下,话说,我不知道其他系统下是什么情况,百度后再修改),栈的大小是一定的,而堆的大小是有限于计算机的虚拟内存,即硬盘大小,因此,堆的空间比栈要大很多。

3,堆存放的一般是对象,数组等,而栈存放的是变量,值。

c通过malloc申请堆空间,c++,java通过new创建对象,对象存放在堆里,而变量等,则存放在栈中,简单的说,就是对象,数组等占空间大的,存放在堆中,而像int a 

= 3,等的值则存放在栈中,

  • 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 "优化成一个地方。

  • }   这一段的代码很好,是位前辈写的,我copy来了,看着都觉得简单明了了很多。

​4,堆是程序员操作释放的,而栈是系统回收的。

堆创建是要通过malloc,new等通知系统创建,结束时也要通过free等方法告诉系统释放空间。而栈是,系统自动回收的,如变量,当不在其作用范围的时候,便会被系统释放掉,这样有利于栈的空间管理。

堆栈还有其他一大堆,遇到了补上。

------- android培训java培训、期待与您交流! ----------

详情请查看:http://edu.csdn.net/heima


0 0