黑马程序员-堆与栈

-------  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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值